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;
(如果你想要,则为非零)语句。
希望这可以帮助。