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

标签 c memory data-structures segmentation-fault void-pointers

好吧,我正在用 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/

相关文章:

c - 保存到 C 子文件夹中的文件 (.dat) 或从中读取文件 (.dat)

java.lang.OutOfMemoryError : PermGen space in play framework

algorithm - 如何构建一棵树然后遍历每个叶子(每次从根节点到叶子)?

c - 显示单链表内容,退出时代码崩溃

java - JVM 的功能/不可变数据结构?

c - 在 C 中使用指针循环遍历结构元素

c - Win32 在当前控制台执行子进程并退出而不返回父进程

ios - 在 Swift 中使用 C 函数

C++ 如何读取函数的前几个字节? (32位机)

javascript - 如何监控 Node.js 的内存使用情况?