2017-08-13 89 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

也应该'免费'并检查系统是否给你记忆。 –