为结构“错误”分配内存

Posted

技术标签:

【中文标题】为结构“错误”分配内存【英文标题】: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)); 它可以工作,但如果我没记错的话,它不需要那样做。谁能帮我说说为什么会这样?

【问题讨论】:

【参考方案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,您需要:

    将指针传递给原始节点。当您取消引用此指向 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 补充说明

以上是关于为结构“错误”分配内存的主要内容,如果未能解决你的问题,请参考以下文章

malloc分配内存为多大?

C 语言结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )

为具有双指针的结构内的动态结构数组分配内存**

shmget 如何分配内存?无法使用线性寻址访问(地址边界错误)

结构成员大小大于为结构分配的内存

Linux程序:--OpenSSL库之相关数据结构和内存分配