c++ - 无法理解此 return 语句的功能,没有它会发生运行时错误
问题描述
在下面if
的函数语句bstcreate()
中,如果我删除该return
语句,则会发生运行时错误。这是为什么?
while
即使没有该语句,该过程是否不应该进入该return
语句,因为所有语句都已执行?
下面是代码:
struct Node{
struct Node *lchild;
int data;
struct Node *rchild;
}*root=NULL;
void bstcreate(int key)
{
struct Node*t=root;
struct Node*p,*r=NULL;
if(root == NULL)
{
p = (struct Node*)malloc(sizeof(struct Node));
p->data = key;
p->lchild = p->rchild = NULL;
root = p;
return;
}
while(t)
{
r=t;
if(key<t->data)
{
t=t->lchild;
}
else
{
t=t->rchild;
}
}
p = (struct Node*)malloc(sizeof(struct Node));
p->data = key;
p->lchild = p->rchild = NULL;
if(r->data>key)
{
r->lchild=p;
}
else
{
r->rchild=p;
}
}
解决方案
如果列表为空,则bstcreate()
设置root
为 new Node
,然后预计会立即退出,因为没有其他事情可做。该return
语句执行该退出。由于该函数被声明为返回void
,因此无需为 提供值return
。
t
被初始化为root
并被r
初始化为NULL
。如果您删除该return
语句,并且root
在NULL
进入时,则t
最初会NULL
导致while
循环被跳过,然后在访问成员时发生崩溃,r
因为r
仍然是NULL
因为循环没有分配r
指向任何地方。
推荐阅读
- javascript - 如何使用 useEffect 钩子将 DOM 元素添加到我的状态,而不会在控制台中出现错误/警告?
- r - 在具有条件的变异函数中混合来自 2 个数据帧的值
- android - 如何到达滚动视图的最后一项?
- laravel - Laravel HasManyThrough CrossDatabaseRelation
- r - 合并不同列表中的多个数据框
- docker - 如何使用修改后的电报配置文件运行 docker compose 文件?
- python - 在 Python 中用不同颜色在同一个图上绘制 n 个不同的图
- c# - ML.NET 列属性不包含“序数”
- c# - 如何制作WPF背景动画循环?
- c++ - 为什么 sqllite while(query.next()){} 没有停止循环?(如何停止while循环)