在以下程序中分配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);
}
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);
其他答案已经指出了这个问题以及如何解决它。我的建议是更改函数,使其使用更自然。
代替
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);
}