我对C的基础知识有疑问。
add()
函数中,我没有返回任何内容,因此我预计输出将是一些垃圾值或其他东西,但它并没有像这样发生。任何人都可以向我解释为什么会这样吗?如果我在代码中写错了,请原谅。add1
的内存将来自堆栈,因此一旦add()
完成,所有分配的内存都将被释放,因此将显示一些垃圾值。 代码示例:
main() {
int x = 4, sum;
int n;
printf(" enter a number \n");
scanf("%d", &n);
sum = add(x, n);
printf(" total sum = %d\n", sum);
}
add(int x, int n) {
int add1 = 0;
add1 = x + n;
//return(add1);
}
答案 0 :(得分:0)
这是未定义的行为。
如果未指定函数返回的内容,则默认为int。然后当你没有return语句时,将会发现未定义的内容。所以原则上任何事都可能发生。
对于gcc
,它会在许多系统上返回一些“随机”值。在你的情况下,它恰好是总和。只需“运气”。
在编译过程中始终打开警告,例如gcc -Wall
并始终将警告视为错误。
您的代码应该类似于:
#include <stdio.h>
int add(int x,int n); // Corrected
int main(void) // Corrected
{
int x=4,sum;
int n;
printf(" enter a number \n");
scanf("%d",&n);
sum = add(x,n);
printf(" total sum = %d\n",sum);
return 0; // Corrected
}
int add(int x,int n) // Corrected
{
int add1=0;
add1 = x+n;
return add1; // Removed the // to uncomment and removed unnecessary ()
}
答案 1 :(得分:0)
如前所述,这是未定义的行为,您不应该依赖它。
然而,正在发生的事情背后有一些逻辑。按照惯例,函数的返回值存储在x86上的eax
寄存器或x86_64上的rax
寄存器中。只是您的编译器也使用eax
或rax
寄存器来存储计算值。此外,由于未指定add()
的返回类型,因此将其隐式定义为int
。