C中函数的返回值

1 c recursion return-value

int ret(char *)
{
    //nothing    
}

int main(void)
{
   printf("%d\n",ret("foo"));
}
Run Code Online (Sandbox Code Playgroud)

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

int my_strlen(char *s)
{
   if(*s)
      return 1 + my_strlen(s + 1); // or my_strlen(s+1) + 1;
}
Run Code Online (Sandbox Code Playgroud)

在上面的函数中,如果我没有错,my_strlen应该总是在条件失败时(即每当它到达'\ 0'时)返回垃圾值,因为没有其他情况或任何返回语句的错误情况.所以对于任何有效的字符串,它应该总是返回1 +垃圾值.但事实并非如此.它工作正常.它给出了任何字符串的确切长度.为什么它不像函数" ret "那样返回垃圾值呢??? 请清楚我的怀疑.任何帮助将不胜感激.感谢名单..

hmj*_*mjd 8

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

如果}终止了函数,并且调用者使用了函数调用的值,则行为是未定义的.

未定义行为的子集似乎正常工作,这是第二个代码片段中见证的内容.