2013-07-08 21 views
0
Node *create_node() { 
    Node node = malloc(sizeof(Node)); 
    node.cargo = next_free_cargo++; 
    return &node; 
} 

我以爲malloc在堆上創建了東西?爲什麼這仍被認爲是一個局部變量?爲什麼這個結構初始化不起作用(不能返回本地變量的地址)

另外,這是正確的方法嗎?

Node *create_node() { 
    Node *node = malloc(sizeof(Node*)); 
    node->cargo = next_free_cargo++; 
    return node;  
} 

當我讀到它時,這會爲指向節點的指針創建內存。但它如何爲節點本身分配內存?

回答

7

我以爲malloc在堆上創建了東西?爲什麼這仍被認爲是一個局部變量?

malloc()並動態地分配存儲器,並給出所分配的存儲器的編程的壽命控制(直到free()上調用返回的指針)。但是,這個代碼不正確(和編譯器應該具有emitted an error):

Node node = malloc(sizeof(Node)); 

node指針,堆棧因此編譯器警告它是一個局部變量的分配。更改爲:

Node* node = malloc(sizeof(Node)); /* or malloc(sizeof(*node)); */ 
if (node) 
{ 
    node->cargo = next_free_cargo++; 
} 
return node; 

此外,這是正確的方法是什麼?

第二片段也是不正確的,因爲它是唯一一個Node*分配足夠的內存,當它需要一種用於Node分配內存。

3

這是正確的方法:

Node *create_node() { 
    Node *node = malloc(sizeof(Node)); 
    node->cargo = next_free_cargo++; 
    return node;  
} 

malloc函數分配的的sizeof(節點)字節的存儲緩衝器,它返回一個指針,該存儲區域。內存分配在堆上,從函數返回後可以引用它。當不再需要時,它的內存應該被釋放。

相關問題