未指定的返回值

时间:2012-12-13 11:37:36

标签: c return return-value

关于返回值:

func()
{
  while(1)
  {
    /* do stuff here */
    if(error1) exit(0);
    if(error2) break;
  }       
  /* no return statement anywhere in func() */
}

但是调用者检查func()

的返回码
if(func()) {/* error handling */}

有人确认func()的返回值不会默认为任何东西而且是垃圾的。这对所有这些都是如此:

  • void func()
  • int func(),根本没有返回语句,或者使用普通return;
  • func(),未指定的返回类型,我理解默认返回int。

感谢..

3 个答案:

答案 0 :(得分:3)

注意:此答案适用于C89(及更早版本)。

void func()指定不返回值的函数。在这种情况下,if (func())应该导致编译错误。

int func()func()是等效的,并返回一个整数值。 如果return语句没有提供任何值,则结果是未定义的,如果警告级别足够高,编译器将发出警告。 实际上,大多数编译器都会生成代码,返回寄存器中的内容或用于返回值的内存位置。

答案 1 :(得分:2)

函数的返回值通常是处理器的第一个寄存器返回的 ,例如。基于x86的EAX或基于ARM的处理器的r0。它是特定于编译器的,但这或多或少是标准的。

例如,C中的return 10;将被翻译为

mov eax 10 ; pseudo code
ret        ; pseudo code

在基于x86的处理器的程序集中。

&安培;在检查返回值时,它只会检查eax寄存器。该寄存器中包含的内容被调用者视为返回值。

SO ...如果你没有返回值(简单return;)或者它是一个void函数,那么在汇编中ret语句之前的EAX中包含的任何值都被视为返回值来电者。

对于基于ARM的处理器,请在上面的答案中将EAX替换为r0。 : - )

我将此事实用作以下功能的黑客; - )

void* getStackTop(){
   asm("mov eax esp");
}

要在从C语言转换为ASM时检查其工作原理,请编写如下的简单代码:

int testfn(int unused){
   int unused2=unused; // Check how input is passed
   return 10;          // Check how output is returned
}

&安培;然后用gcc -S编译它。 (或者您的编译器带有一些只会生成程序集的标志。)


我不确定它是如何返回float / struct值的。 可能它返回一个指向struct&的指针。整个返回的结构是在引擎盖下记忆,同时转换为asm。有人可能会纠正: - )

答案 2 :(得分:0)

自C99标准以来,您在无效C代码中发布的代码。

如果您使用的是实现C90标准的过时编译器,它将进行编译,然后默认类型为int。我相信从这样的函数中省略return语句会导致未定义的行为,但我不能引用C90标准。