我正在编写一个编译器项目。我创建了一个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
。你有什么想法,为什么会这样?
答案 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()
事件。