【发布时间】:2021-11-22 07:24:48
【问题描述】:
malloc 有什么用,而不仅仅是在 c 函数中创建结构?例如,这是在二叉搜索树中创建节点的模型代码。
void insertBSTNode(BTNode **node, int value)
{
if (*node==NULL)
{
*node=malloc(sizeof(BTNode));
(*node)->item =value;
(*node)->left =NULL;
(*node)->right = NULL;
return;
}
if ((*node)->item > value)
insertBSTNode(&((*node)->left), value);
else if ((*node)->item <value)
insertBSTNode(&((*node)->right), value);
else
{
printf("Already exists in the BST\n");
return;
}
return;
}
我尝试做类似的事情,但改为像这样创建结构:
void insertBSTNode(BTNode **node, int value)
{
if ((*node) == NULL){
BTNode insert;
insert.item = value;
insert.left = NULL;
insert.right = NULL;
(*node) = &insert;
return;
}
else {
int Nodeitem = (*node)->item;
if (value>Nodeitem){
insertBSTNode(&((*node)->right),value);
return;
}
if (value<Nodeitem){
insertBSTNode(&((*node)->left),value);
return;
}
}
}
但 Nodeitem 将始终是地址。为什么 malloc 在这种情况下工作?当我使用
BTNode insert,这与使用 malloc 而不是 &insert 只是指向内存位置不同吗?那我应该改用 malloc 吗?
【问题讨论】:
-
您的第二个版本创建了悬空指针,因此您的代码将调用 未定义的行为(并且通常会做一些奇怪的事情)
-
我可以知道为什么它会创建悬空指针吗?我应该怎么做才能更正第二个版本。
-
在您的代码中,
insert是一个自动变量(在块或函数中定义,而不是静态的)。它将在定义它的 bloc 结束时达到其生命周期的终点,并且任何指向它的指针都将在此之后被称为 dangling。因为在对象达到其生命周期结束后尝试使用它显然是未定义的行为。 -
感谢您的帮助!我假设(非常错误地)记忆在某种程度上比函数中的变量更永久。
标签: c binary-search-tree dsa