0

我写了这段代码,因为我在我正在编写的一个更大的程序中遇到了类似的问题。据我所知,问题是一样的,所以我做了这个小例子。

#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 编译器?

4

3 回答 3

8

你的代码。ANSI 允许字符串常量是只读的,这是鼓励的,因为这意味着它们可以在程序的所有正在运行的实例之间在系统范围内共享;gcc除非您指定-fwritable-strings, 否则会这样做,tcc而使它们可写(可能是因为它更容易)。

于 2011-06-04T19:02:54.380 回答
0

val是一个指向只读位置的点。

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

readOnly无法修改指向数据。

于 2011-06-04T19:04:15.117 回答
0

正如其他答案所指出的那样,val指向一个字符串常量。尝试

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

并记得检查您val是否NULL在实际程序中使用它。

于 2011-06-04T19:11:37.240 回答