C99 标准是否允许写入复合文字(结构)?似乎它不提供对文字字符串的写入。我问这个是因为它在C Programming: A Modern Approach, 2nd Edition on page 406 中说。
问:允许指向复合文字的指针似乎可以修改文字。是这样吗?
答:是的。复合文字是可以修改的左值。
但是,我不太明白它是如何工作的,以及它如何与你当然无法修改的字符串文字一起工作。
char *foo = "foo bar";
struct bar { char *a; int g; };
struct bar *baz = &(struct bar){.a = "foo bar", .g = 5};
int main () {
// Segfaults
// (baz->a)[0] = 'X';
// printf( "%s", baz->a );
// Segfaults
// foo[0] = 'a';
// printf("%s", foo);
baz->g = 9;
printf("%d", baz->g);
return 0;
}
您可以在我的段错误列表中看到,写入会baz->a
导致段错误。但是,写入baz->g
不会。为什么其中一个会导致段错误而不是另一个?结构文字与字符串文字有何不同?为什么不将结构文字也放入内存的只读部分,并且为这两者定义或未定义行为(标准问题)?