2014-11-05 99 views
0

为什么在下列程序中分配xy时会出现运行时错误?如何重写allocate_nodemain以防止它?为什么这个C程序遇到运行时错误?

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

回答

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); 
+0

'* f = malloc(sizeof(Foo));' – mch 2014-11-05 17:01:39

+0

@mch谢谢,修正。 – AlexD 2014-11-05 17:03:20

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

我会叫他们allocate_foo和deallocate_foo,因为一旦程序变大,你会想分配不同的东西。 – gnasher729 2014-11-05 17:22:57

+0

@ gnasher729,不错的建议。 – 2014-11-05 17:29:22

相关问题