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



在以下程序中分配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); 
} 

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

相关内容

  • 没有找到相关文章

最新更新