为什么这个C程序遇到运行时错误?

时间:2014-11-05 16:58:41

标签: c runtime malloc

为什么在以下程序中分配xy时会出现运行时错误?如何重写allocate_nodemain以阻止它?

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); 
} 

2 个答案:

答案 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_foodeallocate_foo以确保随着程序的增长,您可以为其他类型的对象创建其他allocate_xxxdeallocate_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); 
}