我正在学习 C,只是想弄清楚我对内存如何分配的理解。我正在使用以下代码,它出现了段错误,但我不确定为什么。有什么指点吗? (没有双关语的意思)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Table {
int* elements;
} Table;
int main(void) {
Table* table = {0};
table->elements = calloc(1, sizeof(int)*3);
memcpy(table->elements, (int[]) {1, 1, 1}, 3*sizeof(int));
int* new_elements = calloc(1, sizeof(int)*5);
memcpy(new_elements, (int[]) {2, 2, 2, 2, 2}, 5*sizeof(int));
free(table->elements);
table->elements = new_elements;
for (int i = 0; i < 5; i++) {
printf("%d\n", table->elements[i]);
}
return 0;
}
Table* table = {0};
将 table
初始化为空指针。它指向“什么都没有。”
然后
table->elements = …
尝试使用 table
来引用结构中的 elements
成员。但是,由于 table
没有指向任何内容,因此没有结构,也没有可以访问的成员。最有可能的是,这会导致尝试访问未映射到您的进程的内存并导致段错误。
要修复此问题,您必须将
table
设置为指向 Table
类型结构的内存。或者您可以将 table
更改为结构体而不是指针,并在代码中进行相应的更改,例如将 table->elements
更改为 table.elements
。