C语言编程 - 函数问题

时间:2011-06-17 14:01:51

标签: c

int fn()
{
    return 10;
}

int main()
{
    printf("%d\n\n",fn);
    system("pause");
}

该程序给出一个随机数,但是当进行函数调用时,它返回值10。

我可以得出结论,当我们在printf语句中使用函数名时,它会给出一个垃圾值或者还有其他一些概念吗?

由于

7 个答案:

答案 0 :(得分:6)

应该是:

  printf("%d\n\n",fn());

fn对应于函数的指针地址。这就是你得到垃圾号码的原因。 要调用函数,必须使用如下括号:

foo();
foo(parameter1, ..., parameterN);

答案 1 :(得分:3)

您正在内存中打印fn代码的实际地址,而不是调用它。打电话给你,你的生活将会启发!

printf("%d\n\n", fn());

请在逗号之后加上一个空格,就像往常一样。

答案 2 :(得分:2)

忘记调用该函数:)

fn更改为fn()

printf("%d\n\n", fn());

现在这是你用省略号得到的 - 没有类型检查......

答案 3 :(得分:2)

  • 当您对fn()说它将进行函数调用
  • 当您对fn说时,它指的是应该拨打电话的功能的地址

因此printf("%d\n\n",fn);将打印函数地址的地址,而不是随机数,printf("%d\n\n", fn());将调用该函数并打印返回的内容。

注意区别:

int fn (void)
{
  return 10;
}
int main (void)
{
  int x, y;
  x = fn();
  y = fn;
}

这是编译器输出:

fn:
        push    ebp
        mov     ebp, esp
        mov     eax, 10
        pop     ebp
        ret
        .size   fn, .-fn
.globl main
        .type   main, @function
main:
        lea     ecx, [esp+4]
        and     esp, -16
        push    DWORD PTR [ecx-4]
        push    ebp
        mov     ebp, esp
        push    ecx
        sub     esp, 20

        ; below code does x=fn();
        call    fn                                 ; calls fn, return value in eax
        mov     DWORD PTR [ebp-12], eax            ; stores eax in ebp-12, the location for x on the local stack allocated by compiler


        ; below code does x=fn;
        mov     DWORD PTR [ebp-8], OFFSET FLAT:fn  ; stores the label address in ebp-8, the location for y on local stack allocated by compiler

        add     esp, 20
        pop     ecx
        pop     ebp
        lea     esp, [ecx-4]
        ret

答案 4 :(得分:1)

fn()不是fn

printf("%d\n\n",fn());

答案 5 :(得分:1)

当你输入fn()时,你没有调用这个函数。这就是你调用函数时应该给你正确的结果。(见下文)

int fn()
{
    return 10;
}

int main()
{
    printf("%d\n\n" , fn() );
    system("pause");
}

答案 6 :(得分:-1)

您应该将printf()语句更改为此

printf(“%d \ n”,fn());

现在,这样可以正常工作。