传递一个未初始化的变量投掷用C
我有这样的代码中的错误:传递一个未初始化的变量投掷用C
typedef struct node
{
int data;
struct node *left;
struct node *right;
} node;
void Build (node *root , int i)
{
if (i < 7)
{
root = (node *)malloc (sizeof(node));
root->data = i;
Build(root->left,2*i+1);
Build(root->right,2*i+2);
}
else
root = NULL;
}
void Print (node *root)
{
if (root)
{
printf ("%d ",root->data);
Print(root->left);
Print(root->right);
}
}
void main()
{
node *tree;
Build(tree,0);
Print(tree);
}
两件事情,我不明白, 1.我为什么不能过建立(树,0)?它说它是未初始化的,但为什么我会关心它是否未初始化?我直接分配所有需要的内存,所以它会指向新分配的节点。
我该如何解决这个问题?谢谢!!!
您的node *
树未被初始化。
node *tree;
这很重要,因为代码行
root = (node *)malloc (sizeof(node));
分配内存的本地副本的根。一旦您离开功能范围Build,根的副本超出范围。内存泄漏。
请记住,一切都是由价值C.
过去了如果你真的想构建分配内存,签名必须是
void Build (node **root , int i)
,并在该方法的代码会必须参考*root
而不是root
。
,但即使是当地的 - 所以它不应该当我dissapear完成func – user1386966 2012-07-18 23:39:04
确实如此,指针是通过值传递的,这意味着在栈上有一个指针的本地副本......一个指向没有指针的指针你的malloc分配内存到本地(堆栈)副本尝试在调试器中逐步完成。 – 2012-07-18 23:46:38
参数按值传递 - 内存中的位置实际上没有传递。所以当你调用Build时,你只是传入了树的值,这恰好是未初始化的。 Build函数创建一个具有该值的本地根变量 - 当您在Build中设置root = ...
时,您将用新值覆盖未定义的值,但是该新值仍然只存在于本地根变量中 - 它从未见过由主变量树变量。
你真正想要做的是有构建返回新创建的树指针:
node * Build(int i)
{
node *root;
...
root->left = Build(2*i+1)
...
return root;
}
void main()
{
...
tree = Build(0);
...
}
'无效的主要()':( – Marlon 2012-07-19 00:04:37