使用malloc和struct进行分段错误(核心转储)

时间:2018-05-03 15:19:19

标签: c linux struct malloc

我无法理解为什么这个简单的代码不能在不引起linux上的分段错误的情况下运行:

#include <stdlib.h>

struct entry
{
   int value;
};

void initEntry(struct entry *entry)
{
  entry = malloc(sizeof(struct entry));    
  entry->value = 0;
}

int main()
{
  struct entry *list;

  initEntry(list);    
  list->value = 5;
}

我可以在删除最后一条指令(list->value = 5;

后运行程序

我编译:

gcc main.c -o main

1 个答案:

答案 0 :(得分:4)

您需要将其更改为:

void initEntry(struct entry **entry) {
  *entry = malloc(sizeof(struct entry));    
  (*entry)->value = 0;
}

int main() {
  struct entry *list;    
  initEntry(&list);    
  list->value = 5;
}

在您的代码中,从initEntry()调用返回后,您将丢失已分配内存的地址。这是因为entry参数是关于initEntry()函数的局部变量,并且任何值的赋值都是从外部看不到的。您需要额外的无效级别才能返回已分配内存的地址。