2011-06-04 68 views
0

,因为我在较广的节目,我正在写一个类似的问题,我写了这个代码。对于我所知道的问题是一样的,所以我做了这个小例子。gcc编译的C字符串赋值问题

#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编译器)编译时,它会编译并执行正常。但是,使用GCC 4.6.0 20110513(预发布)编译,但是,当我执行它时,我只能通过“初始化工作”。在获得段错误之前。

我在做什么错?它是我的代码还是我的GCC编译器?

+0

[这个答案](http://stackoverflow.com/questions/164194/why-does-simple-c-code-receive-segmentation-fault/164258#164258)说,这很好。 – ladaghini 2011-06-04 19:05:59

回答

8

您的代码。 ANSI允许字符串常量是只读的,这是鼓励的,因为这意味着它们可以跨系统在整个程序的所有运行实例中共享; gcc这样做,除非你指定-fwritable-strings,而tcc让他们写的(可能是因为它更容易)。

+0

谢谢。所以我说它是可写的?我必须创建一个字符数组并链接到该字符串,而不是指向字符串的指针? – Tnelsond 2011-06-04 19:09:47

+0

@Tnelsond:你不应该依赖这种行为,而是不要*从'const char []'(它在'const char *'中退化)初始化'char *'。改为使用副本。 – rubenvb 2011-06-04 19:22:01

+0

所以我应该使用字符串文字中的strcpy函数来创建一个可修改的字符串? – Tnelsond 2011-06-04 19:49:49

0

val是一个指向只读位置。

char *readOnly = "Data in read only location" ; 

readOnly指向的数据不能被修改。

0

至于其他的答案已经指出,在val字符串常量指向。尝试

my_struct me = {4, malloc(2)}; 

,并注意检查valNULL,如果你在一个真正的程序使用此。

+0

哦,所以我就是这样做的。所以我必须事后释放malloced字符串?或者在退出计划时自行解脱? – Tnelsond 2011-06-04 19:15:50

+0

@Tnelsond - 您需要使用'free'显式释放资源。 – Mahesh 2011-06-04 19:17:54

+0

即使我的程序正在退出,我需要释放它吗?如果是这样的话,对我来说,创建一个字符数组并链接到该数组,而不是使用malloc分配内存会更好吗? – Tnelsond 2011-06-04 19:22:15