当我遇到一个我无法解决的问题时,我正在玩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));
它有效,但如果我没记错的话就不需要这样做。任何人都可以帮我说出为什么会这样?
答案 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
:
将指针传递给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);
}
请勿忘记在使用后将其释放