2011-07-25 184 views
4

爲什麼下面打印1。我期待它打印函數指針的地址。函數指針C

#include <stdio.h> 

int main(main) { 
    printf("%i",main); 
    return 0; 
} 
+2

'main'不會是'int',所以由於'%i'你總是有未定義的行爲 - 所有的注單都關閉了,所以它不妨去吃IDE的日誌文件並打印第一個數字它發現它。 – delnan

回答

10

指針必須用%p打印。無論如何,這裏存在一個「鋸齒」問題,但很奇怪,但它是這樣的:main獲得函數main的第一個參數的值,即通常稱爲「argc」的值。如果你用更多的參數來調用它,你應該看到更大的數字。

+0

當然,通過使用函數的第一個參數的名稱將'main'作爲func「ghosted」,'%i'是合適的,因爲'main'結束爲一個整數。 – ShinTakezou

+0

**數據**指針必須用%p打印(參考:「參數應該是一個指向void的指針」(7.19.6.1))。函數指針不能轉換爲void *,只能轉換爲其他函數指針類型。 –

+0

@帕斯卡我想這是一個曲解。在其他地方,有人可能會說一個指針(不管是什麼)不能保證適合任何整數類型的大小,這樣就無法打印它, %lu,%llu.Function指針可以轉換爲void *(引用std部分禁止它,UB?;我試過gcc -ansi -strict並且沒問題)。引用的句子說%p得到了「generic 「指針,沒有任何引用,明顯;它沒有說它必須指向」數據「(代碼是數據,btw)。 – ShinTakezou

3

因爲程序的main函數的第一個參數是參數計數(加1,因爲程序的名稱是第一個參數)在運行時。假設你在沒有參數的情況下調用你的程序,那麼這個值將被填充一個整數。

許多人傳統上使用main具有以下特徵:

int main(int argc, char **argv); 

如果刪除參數,你可能會得到你想要的東西:

int main() { 
    printf("%i", main); 
    return 0; 
} 

如果不行,請嘗試聲明高於函數定義的int main();

如果這不起作用,首先問自己爲什麼要這樣做。 :-P

1

你宣佈與名稱的參數「main」 - 這PARAM對應main功能的C的第一個參數而這又通常被稱爲「argc」這又是1,如果你開始你的程序沒有任何命令參數。

1

main的第一個參數通常被稱爲argc,它告訴你程序運行了多少個參數。既然你沒有參數運行這個值,那麼這個值就是1(可執行文件的名字)如果你從命令行運行這個參數,那麼額外的參數用空格分開,這個數字將會增加。

1

這相當於

#include <stdio.h> 

int main(int main) { 
    printf("%i",main); 
    return 0; 
} 

所以mainmain函數的第一個參數。如果不帶參數調用,argv數組的大小爲1,argv [0]保存進程的名稱。

1

您包括main作爲功能main的參數。這會得到通常給予main的第一個值,即傳遞給程序的參數的大小。如果您沒有將參數傳遞給程序,那麼參數仍然包含正在執行的程序的名稱,因此參數列表的大小是1,它打印的是什麼。