如果代码中没有 return 语句,函数 returns 在 C 程序中有什么作用
what does the function returns with in C program , in case if there is no return statement in the code
我做了一个关于如何在 C 中递归地反转单链表的函数。
功能如下
struct node * reverseSLL2(struct node *p,struct node *temp)
{
struct node *temp1;
if(p!=NULL)
{
temp1=p->link;
p->link=temp;
reverseSLL2(temp1,p);
//return;
}
else
{
return temp;
}
}
我调用 head=reverseSLL2(head,NULL) ,其中 head 是指向我链接的第一个节点的指针 list.The 程序正常工作!
但是,我有两个问题:
1) 除了最后一次调用之外,我对函数的所有调用都没有到达 return 语句,那么那些函数 returns 有什么作用?
2) 如果我写(取消注释)前面代码中已经注释掉的return语句。在那种情况下,函数 returns 与 ?
有什么关系?
谢谢。
这是未定义的行为。通过缺少 return
.
的代码路径编译代码应该会产生一个关于到达函数末尾的警告
您没有看到函数被破坏并观察到它产生正确结果的原因是因为 return 来自基本案例分支的实际值(即 else
) 确实有一个正确的 return
。编译后的代码可能会在堆栈上层函数的所有调用中重用最后一个 return 值,因此调用者最终会获得预期的值。
但是,代码无效。您应该在递归调用前添加 return
以解决问题:
return reverseSLL2(temp1,p);
当非空函数 return 没有 return 语句时,它是 未定义行为 (UB)。确保避免这种情况。
但是,即使不使用 return 语句,该函数仍然可能 return 某些东西。例如,在 x86 架构上,该函数将 return eax
寄存器中的任何内容,这很可能是局部变量之一。
我敢打赌你 运行 在函数结果在寄存器中的机器上(例如 32 位 x86 上的 EAX),并且递归的 return 值当您 return 没有值时,调用仍然位于该寄存器中,因为它从函数的末尾掉下来。编译器不必使用该序列,因此它仍然是未定义的行为。
您只需将 return 添加到递归调用即可修复您的版本:
return reverseSLL2(temp1,p);
我做了一个关于如何在 C 中递归地反转单链表的函数。
功能如下
struct node * reverseSLL2(struct node *p,struct node *temp)
{
struct node *temp1;
if(p!=NULL)
{
temp1=p->link;
p->link=temp;
reverseSLL2(temp1,p);
//return;
}
else
{
return temp;
}
}
我调用 head=reverseSLL2(head,NULL) ,其中 head 是指向我链接的第一个节点的指针 list.The 程序正常工作!
但是,我有两个问题:
1) 除了最后一次调用之外,我对函数的所有调用都没有到达 return 语句,那么那些函数 returns 有什么作用?
2) 如果我写(取消注释)前面代码中已经注释掉的return语句。在那种情况下,函数 returns 与 ?
有什么关系?谢谢。
这是未定义的行为。通过缺少 return
.
您没有看到函数被破坏并观察到它产生正确结果的原因是因为 return 来自基本案例分支的实际值(即 else
) 确实有一个正确的 return
。编译后的代码可能会在堆栈上层函数的所有调用中重用最后一个 return 值,因此调用者最终会获得预期的值。
但是,代码无效。您应该在递归调用前添加 return
以解决问题:
return reverseSLL2(temp1,p);
当非空函数 return 没有 return 语句时,它是 未定义行为 (UB)。确保避免这种情况。
但是,即使不使用 return 语句,该函数仍然可能 return 某些东西。例如,在 x86 架构上,该函数将 return eax
寄存器中的任何内容,这很可能是局部变量之一。
我敢打赌你 运行 在函数结果在寄存器中的机器上(例如 32 位 x86 上的 EAX),并且递归的 return 值当您 return 没有值时,调用仍然位于该寄存器中,因为它从函数的末尾掉下来。编译器不必使用该序列,因此它仍然是未定义的行为。
您只需将 return 添加到递归调用即可修复您的版本:
return reverseSLL2(temp1,p);