好吧,我正在用 c 编写 vector 数据结构(或动态列表)。 这是我的节点结构:
struct vector_node{
void *value;
};
这是我的 vector 结构:
struct vector{
int size;
int capacity;
vector_node *start;
vector_node *end;
vector_node **nodes;
};
下面是我如何为 vector 创建和分配内存:
vector* createVector(){
vector *vector = malloc(sizeof(vector));
vector->size = 0;
vector->capacity = 8;
vector->start = NULL;
vector->end = NULL;
vector->nodes = malloc(8*sizeof(vector_node));
int i = 0;
vector->nodes[0]->value = (int) &i;
}
最后两行是我遇到麻烦的地方。似乎每当我尝试初始化值变量时,我都会遇到段错误。
最佳答案
线
vector->nodes = malloc(8*sizeof(vector_node));
错了。您需要分配一个 vector_node*
数组,因为 vector->nodes
是 vector_node**
类型。避免此类错误的推荐方法是:
Type* x = malloc(count*sizeof(*x));
对于您的程序,这将是:
vector->nodes = malloc(8*sizeof(*(vector->nodes)));
线
vector->nodes[0]->value = (int) &i;
在几个方面是错误的。
- 在尝试取消引用之前,您尚未为
vector->nodes[0]
分配内存。 - 您正在将指针转换为
int
,这可能会导致地址被截断。 vector->nodes[0]->value
的类型是void*
但您正试图为其分配一个int
。- 您将函数局部变量
i
的地址存储在一个struct
中,它将从函数返回。当函数返回时,您将有一个悬空指针。
你需要:
vector->nodes[0] = malloc(sizeof(*(vector->nodes[0])));
vector->nodes[0]->value = <some memory that will outlast the function call>;
最后,在返回类型不同于 void
的函数中没有 return
语句。如果调用代码使用如下内容:
vector* v = createVector();
您的程序将表现出未定义的行为。
关于c - 尝试访问结构中的空指针时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35051986/