如果代码中没有return语句,函数在C程序中返回什么

我做了一个关于如何在C中递归地反转单链表的函数。

function如下。

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是指向链表的第一个节点的指针。程序正常工作!

但是,我有两个问题:

1)除了最后一次调用之外,我对函数的所有调用都没有到达return语句,那么这些函数返回的是什么?

2)如果我编写(取消注释)在前面的代码中注释的return语句。 在那种情况下,函数返回什么?

谢谢。

这是未定义的行为。 编译代码应该产生一个警告,通过缺少return的代码路径到达函数的末尾。

您没有看到函数被破坏并观察它产生正确结果的原因是因为从基本案例分支(即else )返回的实际值确实具有正确的return 。 编译的代码有可能在函数的所有调用中重复使用该最后一个返回值,因此调用者最终得到预期的值。

但是,代码无效。 您应该在递归调用前添加return以解决问题:

 return reverseSLL2(temp1,p); 

当非void函数返回而没有return语句时,它是Undefined Behavior (UB)。 一定要避免这种情况。

但是,即使不使用return语句,该函数仍可能返回一些内容。 例如,在x86架构上,该函数将返回eax寄存器中的任何内容,这很可能是局部变量之一。

我敢打赌你在一台机器上运行,其中函数结果在一个寄存器中(例如32位x86上的EAX),当你返回没有值时,递归调用的返回值仍然位于该寄存器中通过从function结束掉下来。 编译器不必使用该序列,因此它仍然是未定义的行为。

您可以通过简单地将返回添加到递归调用来修复您的版本:

 return reverseSLL2(temp1,p);