Программирование на С - проблема в функциях - PullRequest
2 голосов
/ 17 июня 2011
int fn()
{
    return 10;
}

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

Эта программа выдает случайное число, но при вызове функции возвращает значение 10.

Могу ли я заключить, что когда мы используем имя функции в операторе printf, оно дает значение мусора или в нем есть какая-то другая концепция?

Спасибо

Ответы [ 7 ]

6 голосов
/ 17 июня 2011

Должно быть:

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

fn соответствует адресу сообщения функции. Вот почему вы получаете номер мусора. Чтобы вызвать функцию, вы должны использовать круглые скобки, например:

foo();
foo(parameter1, ..., parameterN);
3 голосов
/ 17 июня 2011

Вы печатаете фактический адрес кода fn в памяти, а не вызываете его. Позвоните, и ваша жизнь осветит!

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

И, пожалуйста, ставьте пробел после запятой, как всегда.

2 голосов
/ 18 июня 2011
  • Когда вы говорите 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
2 голосов
/ 17 июня 2011

Забыл вызвать функцию:)

изменить fn на fn()

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

Теперь это то, что вы получаете с многоточием - без проверок типов ...

1 голос
/ 17 июня 2011

Вы не вызываете функцию, когда вы набираете fn (), то есть когда вы вызываете функцию и это должно дать вам правильные результаты. (СМ. НИЖЕ)

int fn()
{
    return 10;
}

int main()
{
    printf("%d\n\n" , fn() );
    system("pause");
}
1 голос
/ 17 июня 2011

фн () не фн

printf("%d\n\n",fn());
0 голосов
/ 26 марта 2012

Вы должны изменить свой оператор printf () на этот

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

Теперь это будет нормально работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...