函数的意外返回值

时间:2019-08-31 07:57:47

标签: c

在用户定义的func中,我将值10赋给了k。该函数返回sum的值。为什么函数返回sum的值而不返回k的值?

#include<stdio.h>

int func(int i, int j){
    int sum = 0;
    sum = i + j;
    int k = 10;

}
int main()
{
    int i, j;
    scanf("%d%d", &i, &j);
    printf("%d", func(i, j));
    return 0;
}

3 个答案:

答案 0 :(得分:3)

您的函数被声明为返回int,但是它没有任何return语句!因此,访问该函数的返回值是不确定的行为。这可能会导致读取任何随机值,甚至变得更糟。您获得的值与sum相同的事实只是一个巧合。

实现所需目标的正确方法是在函数正文的末尾添加return k;

答案 1 :(得分:3)

假设您想知道函数为什么不返回最后一个求值语句的值并随机返回其他内容的原因:C运行时调用约定使用特定的寄存器作为返回值(通常为eax) 。 return语句专门将所需的值加载到该寄存器中,而如果没有该值,则该寄存器包含最后一个移入其中的值(主要是最后执行的语句中的垃圾),它可以是任何先前的语句,不需要最后一个。这就是行为未定义的原因。

答案 2 :(得分:0)

编译发布的代码将导致:

gcc    -ggdb -Wall -Wextra -Wconversion -pedantic -std=gnu11  -c "untitled.c"  
untitled.c: In function ‘func’:
untitled.c:6:9: warning: unused variable ‘k’ [-Wunused-variable]
 int k = 10;
     ^

untitled.c:4:9: warning: variable ‘sum’ set but not used [-Wunused-but-set-variable]
 int sum = 0;
     ^~~

untitled.c:8:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^

编译时,请始终启用警告,然后修复这些警告。

但是,OPs代码的主要问题是缺少以下语句:

return sum;

func()函数的最后一个大括号'}'之前

相关问题