2011-06-17 53 views
2
int fn() 
{ 
    return 10; 
} 

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

這個節目給一個隨機數,但是當一個函數調用時,則返回值10程序用C - 問題中的函數

我可以斷定,當我們在使用功能名稱printf語句,它給出了一個垃圾值或者有其他一些概念嗎?

感謝

+1

您正在打印一個函數指針。 – SLaks

+0

只需要注意:要打印一個指針,正確的轉換說明符是''%p「',並且爲了便於移植到奇怪的系統中,指針應該轉換爲void:'printf(」%p \ '(void *)fn);' – pmg

回答

6

它應該是:

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

fn對應功能的ponter地址。這就是爲什麼你得到垃圾號碼。 爲了調用函數必須使用圓括號這樣的:

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

非常感謝你Luzhin :) –

1

FN()不FN

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

非常感謝你 –

2

忘了打電話的功能:)

變化fnfn()

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

現在,您可以通過省略號 - 沒有類型檢查...

+0

非常感謝你 –

3

您正在打印fn代碼的實際地址在內存中,而不是調用它。呼喚它,你的生活將會光芒四射!

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

而且請在逗號後面放一個空格,就像往常一樣。

+0

非常感謝你 –

+0

不需要:D這就是這個網站的要點! – deadalnix

1

你是不是調用該函數,當你FN(類型),站立着的時候調用這個函數,應該給你正確的結果。(見下文)

int fn() 
{ 
    return 10; 
} 

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

非常感謝你 –

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 
-1

你應該改變你的printf()語句來此

的printf( 「%d \ n」 ,fn());

現在,這將工作正常。

+1

歡迎來到SO!請閱讀http://stackoverflow.com/questions/how-to-answer。這個答案早就已經給出了。 –