2014-11-05 107 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

相關問題