繁体   English   中英

C函数的返回值

[英]Return value of function in C

int ret(char *)
{
    //nothing    
}

int main(void)
{
   printf("%d\n",ret("foo"));
}

为什么函数ret返回一个垃圾值?

int my_strlen(char *s)
{
   if(*s)
      return 1 + my_strlen(s + 1); // or my_strlen(s+1) + 1;
}

在上面的函数中,如果我没有记错,则在条件失败时(即,只要达到'\\ 0'),my_strlen应该始终返回垃圾值,因为没有其他情况或任何用于错误情况的return语句。 因此,对于任何有效的字符串,它应始终返回1 +垃圾值。 但是事实并非如此。 工作正常。 它给出任何字符串的确切长度。 为什么它不像函数“ ret ”那样返回垃圾值呢? 请清除我的疑虑。 任何帮助将不胜感激。 谢谢

在这两种情况下,它都是未定义的行为 根据C99标准的第6.9.1节(N869草案)的功能定义 ,第12节:

如果到达终止函数的} ,并且调用者使用了函数调用的值,则该行为未定义。

未定义行为的一个子集似乎正常工作,这在第二个代码片段中得到了证明。

很抱歉,您的问题普遍缺乏尊重。

真正的答案是,在Eclipse / Microsoft C编译器上,您的代码将以“警告”进行编译。 我复制了您的代码,并修复了您可能输入的错误:

   // Here, I added the variable X
   int ret(char *X)
   {
       //nothing
   }

   int main(void)
   {
      printf("%d\n",ret("foo"));
   }

并收到以下消息:

   c:~\eclipsecdt\compilererrormsg\main.c(15) : warning C4716: 'ret' : must return a value

希望此消息解释了修复代码所需的操作。 之所以会产生垃圾,是因为有一个叫做“堆栈”的东西,并且因为没有发出return 0;而没有将整数放置在它上面return 0; (如果需要,则为非零)语句。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM