我无法理解为什么这个简单的代码不能在不引起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
答案 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()
函数的局部变量,并且任何值的赋值都是从外部看不到的。您需要额外的无效级别才能返回已分配内存的地址。