C99 标准是否允许写入复合文字(结构)?它似乎不提供对文字字符串的写入。我问这个是因为它说C 编程:现代方法,第二版 http://knking.com/books/c2/index.html第 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
才不是。为什么其中一个会导致段错误而不是另一个?结构体文字与字符串文字有何不同?为什么结构体文字不也被放入内存的只读部分,并且这两者的行为是定义还是未定义(标准问题)?
首先,您的结构文字有一个初始化为字符串文字的指针成员。结构体本身的成员是可写的,包括指针成员。只有字符串文字的内容是不可写的。
字符串文字从一开始就是语言的一部分,而结构文字(正式称为复合文字)是 C99 中最近添加的内容。到那时,已经存在许多将字符串文字放置在只读存储器中的实现,特别是在具有少量 RAM 的嵌入式系统上。到那时,标准的设计者可以选择要求将字符串文字移动到可写位置,允许结构文字为只读,或者保持原样。这三种解决方案都不是理想的,所以看起来他们走的是阻力最小的道路,一切都保持原样。
C99 标准是否允许写入复合文字(结构)?
C99 标准没有明确禁止写入使用复合文字初始化的数据对象。这与字符串文字不同,字符串文字的修改被标准视为未定义的行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)