我不明白为什么这个简单的代码不能在不导致 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
您需要将其更改为:
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()
函数的局部变量,并且为其分配任何值从外部是不可见的。您需要一个额外的安装级别才能返回分配内存的地址。