如果代码中没有 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);