我正在编写一个编译器项目。我创建了一个 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 个或更多时,它会出现段错误
。您有什么想法吗?为什么会发生这种情况?
最佳答案
正如我在这里看到的,问题在于
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()
事情。
关于c - 未定义长度的结构数组会产生段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34574977/