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

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

在这两种情况下,都是未定义的行为 。 从第6.9.1节C99标准(草案N869)的function定义 ,第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; (如果你想要,则为非零)语句。

希望这可以帮助。