2017-08-13 70 views
2

當我遇到一個我無法弄清的問題時,我只是在玩C。爲struct「error」分配內存

我有一個結構,可以說

typedef struct Node 
{ 
    void * data; 
    int id; 
}Node; 

而且我的程序看起來像

void Node_Init(Node *node) 
{ 
    node = malloc(sizeof(Node)); 
    node->id = 5; 
} 

int main() 
{ 
    Node *node; 
    Node_Init(node); 
    printf("ID %d", node->id); 
} 

當我運行這段代碼和節點 - > ID獲取印刷我得到一個隨機數?這就像node-> id被分配到堆棧而不是堆?

因爲當我做Node *節點;如果我做Node *node = malloc(sizeof(Node));它的作品,但如果我沒記錯,它不需要這樣做。任何人都可以幫我解釋爲什麼發生這種情況?

回答

3
void Node_Init(Node *node) 
{  
     node = malloc(sizeof(Node)); 
     node->id = 5; 
} 

int main() 
{  
    Node *originalnode;  
    Node_Init(originalnode);  
    printf("ID %d", node->id); 
} 

爲什麼你的解決方案不起作用? 當您調用該函數時,參數節點在Node_Init範圍內變爲本地。然後你分配節點(這是本地的)由malloc返回的值。此node的函數返回值變爲不可用之後。 「originalnode沒有變化」它與之前一樣沒有初始化。你的功能是等效的:

void Node_Init(Node *node) 
{ 
     Node *x;  
     x = malloc(sizeof(Node)); 
     x ->id = 5; 
} 

要改變originalnode您需要:

  1. 傳遞指針originalnode。當你解引用這個指針originalnode,並指定值來解除引用的對象更改originalnode 2. 返回的node,並將其分配給originalnode

    void Node_Init(Node **node) 
    { 
        *node = malloc(sizeof(Node)); 
        (*node)->id = 5; 
    } 
    
    int main() 
    { 
        Node *node; 
        Node_Init(&node); 
        printf("ID %d", node->id); 
    } 
    

void *Node_Init(void) // or Node *Node_Init(void) 
{ 
    Node *node 
    node = malloc(sizeof(Node)); 
    node->id = 5; 
    return node; 
} 

int main() 
{ 
    Node *node; 
    node = Node_Init(); 
    printf("ID %d", node->id); 
} 

使用後不要忘記釋放它

+1

'* node-> id = 5;' - >'(* node) - > id = 5;''和'print f(「ID%d」,* node-> id);' - >'printf(「ID%d」,node-> id);' – BLUEPIXY

+0

注意到它mysellf無論如何感謝 –

+1

也應該'免費'並檢查系統是否給你記憶。 –