我写了这段代码,因为我在写一个更大的程序时遇到了类似的问题。就我所知,问题是一样的,所以我做了一个小例子。
#include <stdio.h>
typedef struct
{
int x;
char * val;
}my_struct;
int main()
{
my_struct me = {4, " "};
puts("Initialization works.");
me.val[0] = 'a';
puts("Assignment works.");
puts(me.val);
puts("Output works.");
return 0;
}
使用tcc(Tiny C Compiler)编译时,它编译并执行正常。但是,使用GCC 4.6.0 20110513(预发行版)它会编译,但是,当我执行它时,我只能通过“初始化工作”。在得到段错误之前。
我做错了什么?是我的代码还是我的GCC编译器?
答案 0 :(得分:8)
您的代码。 ANSI允许字符串常量是只读的,这是鼓励的,因为这意味着它们可以跨程序的所有正在运行的实例在系统范围内共享;除非您指定gcc
,否则-fwritable-strings
会这样做,而tcc
会使它们可写(可能因为它更容易)。
答案 1 :(得分:0)
val
是指向只读位置的点。
char *readOnly = "Data in read only location" ;
readOnly
指点数据无法修改。
答案 2 :(得分:0)
正如其他答案所指出的那样,val
指向一个字符串常量。尝试
my_struct me = {4, malloc(2)};
如果您在真实计划中使用此功能,请务必检查val
是否为NULL
。