为结构“错误”分配内存

时间:2017-08-13 10:23:05

标签: c struct

当我遇到一个我无法解决的问题时,我正在玩C语言。

我有一个结构,让我们说

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

当我运行此代码并且node-> id被打印时,我得到一个随机数?就像node-> id在堆栈而不是堆上分配一样?

因为当我做Node *节点时;如果我做Node *node = malloc(sizeof(Node));它有效,但如果我没记错的话就不需要这样做。任何人都可以帮我说出为什么会这样?

1 个答案:

答案 0 :(得分: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);
    }
    
  2. 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);
    }
    

    请勿忘记在使用后将其释放