gpt4 book ai didi

c - 尝试访问结构中的空指针时出现段错误

转载 作者:太空宇宙 更新时间:2023-11-04 05:52:52 24 4
gpt4 key购买 nike

好吧,我正在用 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->nodesvector_node** 类型。避免此类错误的推荐方法是:

Type* x = malloc(count*sizeof(*x));

对于您的程序,这将是:

vector->nodes = malloc(8*sizeof(*(vector->nodes)));

线

vector->nodes[0]->value = (int) &i;

在几个方面是错误的。

  1. 在尝试取消引用之前,您尚未为 vector->nodes[0] 分配内存。
  2. 您正在将指针转换为 int,这可能会导致地址被截断。
  3. vector->nodes[0]->value 的类型是 void* 但您正试图为其分配一个 int
  4. 您将函数局部变量 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com