为结构“错误”分配内存
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 补充说明以上是关于为结构“错误”分配内存的主要内容,如果未能解决你的问题,请参考以下文章
C 语言结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )