未定义的结构长度数组会产生分段错误

时间:2016-01-03 09:16:45

标签: c arrays struct

我正在编写一个编译器项目。我创建了一个AST树,其中每个节点都由结构定义:

typedef struct node {
   char type[10];
   char *string;
   int number_of_children;

   struct node *children[];
} node;

我想创建一个未定义长度的符号数组。我创建了结构,用于存储符号的名称及其在内存中的地址:

typedef struct symbol {
   char *name;
   int address;
} symbol;

然后我创建了未定义长度的数组:

symbol *symbols_table[];

我创建了添加新符号的函数:

void add_symbol(node *p) {
    symbols_table[number_of_symbols] = malloc(sizeof(symbol));
    symbols_table[number_of_symbols]->name = malloc(sizeof(p->string));

    strcpy(symbols_table[number_of_symbols]->name, p->string);
    symbols_table[number_of_symbols]->address = memory_pointer;

    memory_pointer++;
    number_of_symbols++;
}

其中p是来自AST树的节点,需要memory_pointer来为每个符号提供内存中的地址。

这就是问题所在。当我只想向symbols_table添加2个符号时,一切正常。但是当我想要添加3个或更多时,它会给segmentation fault。你有什么想法,为什么会这样?

1 个答案:

答案 0 :(得分:2)

问题,正如我在这里看到的那样是

 symbols_table[number_of_symbols]->name = malloc(sizeof(p->string));

在您的代码中,string是一个指针。因此,sizeof(p->string))不会给你分配内存的大小,它会给你指针本身的大小。稍后,当您执行strcpy()时,它会超出分配的内存,并创建undefined behavior

你想要的是

 symbols_table[number_of_symbols]->name = malloc(strlen(p->string) + 1);

获得正确的内存分配。

根据不同的方法,您还可以查看strdup()以避免整个malloc() + strcpy()事件。