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

标签 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 个或更多时,它会出现段错误。您有什么想法吗?为什么会发生这种情况?

最佳答案

正如我在这里看到的,问题在于

 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/

相关文章:

arrays - 如何使用嵌套类型正确编写数据模型或在 Swift 中使用 CoreData

pointers - Golang 结构问题指向父结构方法

C- 交换结构数组内的字符串或数字的决策函数

c - 当我用printf删除不相关的句子时,我的程序将无法正常运行

javascript - 如何找到与两个数组相交的所有对象?

Javascript/jQuery 填充多维数组...具有数组元素的数组

arrays - 使用 struct 在 Go 中处理空 JSON 数组

c - 为什么 C 允许未初始化的局部变量?

c - 现代 Ada 到 C/C++ 转换器

javascript - 使用数组和循环每隔几秒更改一次标题