int fn()
{
return 10;
}
int main()
{
printf("%d\n\n",fn);
system("pause");
}
這個節目給一個隨機數,但是當一個函數調用時,則返回值10程序用C - 問題中的函數
我可以斷定,當我們在使用功能名稱printf語句,它給出了一個垃圾值或者有其他一些概念嗎?
感謝
int fn()
{
return 10;
}
int main()
{
printf("%d\n\n",fn);
system("pause");
}
這個節目給一個隨機數,但是當一個函數調用時,則返回值10程序用C - 問題中的函數
我可以斷定,當我們在使用功能名稱printf語句,它給出了一個垃圾值或者有其他一些概念嗎?
感謝
它應該是:
printf("%d\n\n",fn());
fn
對應功能的ponter地址。這就是爲什麼你得到垃圾號碼。 爲了調用函數必須使用圓括號這樣的:
foo();
foo(parameter1, ..., parameterN);
非常感謝你Luzhin :) –
FN()不FN
printf("%d\n\n",fn());
非常感謝你 –
忘了打電話的功能:)
變化fn
到fn()
printf("%d\n\n", fn());
現在,您可以通過省略號 - 沒有類型檢查...
非常感謝你 –
您正在打印fn代碼的實際地址在內存中,而不是調用它。呼喚它,你的生活將會光芒四射!
printf("%d\n\n", fn());
而且請在逗號後面放一個空格,就像往常一樣。
非常感謝你 –
不需要:D這就是這個網站的要點! – deadalnix
你是不是調用該函數,當你FN(類型),站立着的時候調用這個函數,應該給你正確的結果。(見下文)
int fn()
{
return 10;
}
int main()
{
printf("%d\n\n" , fn());
system("pause");
}
非常感謝你 –
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
你應該改變你的printf()語句來此
的printf( 「%d \ n」 ,fn());
現在,這將工作正常。
歡迎來到SO!請閱讀http://stackoverflow.com/questions/how-to-answer。這個答案早就已經給出了。 –
您正在打印一個函數指針。 – SLaks
只需要注意:要打印一個指針,正確的轉換說明符是''%p「',並且爲了便於移植到奇怪的系統中,指針應該轉換爲void:'printf(」%p \ '(void *)fn);' – pmg