为什么在以下程序中分配x
和y
时会出现运行时错误?如何重写allocate_node
和main
以阻止它?
typedef struct
{
int x;
int y;
} Foo;
void allocate_node (Foo * f)
{
f = (Foo *) malloc ( sizeof(Foo) );
}
int main ()
{
Foo * p;
allocate_node(p);
p->x = 2;
p->y = 3;
free(p);
}
答案 0 :(得分:3)
allocate_node
按值获取参数。相反,尝试
void allocate_node (Foo ** f)
{
*f = (Foo *) malloc ( sizeof(Foo) );
}
和
Foo * p;
allocate_node(&p);
或者只是
Foo * p = (Foo *) malloc ( sizeof(Foo) );
p->x = 2;
p->y = 3;
free(p);
答案 1 :(得分:2)
其他答案已经指出了问题以及如何解决它。我的建议是改变功能,使其使用更自然。
而不是
void allocate_node (Foo ** f);
使用
Foo* allocate_node();
然后,您可以使用:
Foo* allocate_node()
{
return (Foo*)malloc(sizeof(Foo));
}
int main ()
{
Foo* p = allocate_node();
p->x = 2;
p->y = 3;
free(p);
}
我会更进一步,建议创建一个函数来释放Foo*
以与每个分配必须具有解除分配的概念一致,并且分配和解除分配的函数必须成对出现。另外,命名函数allocate_foo
和deallocate_foo
以确保随着程序的增长,您可以为其他类型的对象创建其他allocate_xxx
和deallocate_xxx
函数(感谢@ gnasher729的建议)。
Foo* allocate_foo()
{
return (Foo*)malloc(sizeof(Foo));
}
void deallocate_foo(Foo* node)
{
free(node);
}
int main ()
{
Foo* p = allocate_foo();
p->x = 2;
p->y = 3;
deallocate_foo(p);
}