【问题标题】:Allocating memory for struct "error" [duplicate]为结构“错误”分配内存
【发布时间】:2018-01-21 09:30:42
【问题描述】:

当我遇到无法解决的问题时,我只是在玩 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 *node = malloc(sizeof(Node)); 它可以工作,但如果我没记错的话,它不需要那样做。谁能帮我说说为什么会这样?

【问题讨论】:

    标签: c struct


    【解决方案1】:
    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 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);
    }
    

    使用后别忘了释放它

    【讨论】:

    • *node->id = 5; --> (*node)->id = 5;printf("ID %d", *node->id); --> printf("ID %d", node->id);
    • 我自己注意到了,谢谢
    • 另外你可能应该free内存并检查系统是否给了你内存。
    • 你应该解释你改变了什么以及为什么
    • @Labba 补充说明
    猜你喜欢
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 2010-11-20
    相关资源
    最近更新 更多