有人可以澄清一下这段代码吗?

时间:2016-07-08 05:46:39

标签: c function memory stack

我对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);
}

2 个答案:

答案 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寄存器中。只是您的编译器也使用eaxrax寄存器来存储计算值。此外,由于未指定add()的返回类型,因此将其隐式定义为int