1
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;
}

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

4

2 回答 2

8

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

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

未定义行为的一个子集似乎可以正常工作,这是在第二个代码片段中所见证的。

于 2013-08-02T13:50:41.733 回答
0

对于您的问题普遍缺乏尊重,我们深表歉意。

真正的答案是在 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;(或者如果你想要的话,非零)语句。

希望这可以帮助。

于 2013-08-03T06:01:12.307 回答