2011-03-24 41 views
28

在打印出指針時遇到問題。每次我嘗試和編譯程序下面我得到以下錯誤:指針在printf()中不起作用

pointers.c:11: warning: format ‘%p’ expects type ‘void *’, but argument 2 has type ‘int *’ 

我顯然簡單的東西在這裏,但是從我所看到類似的代碼等examles,這應該是工作。

這裏的代碼,任何幫助將是偉大的!

#include <stdio.h> 

    int main(void) 
    { 
     int x = 99; 
     int *pt1; 

     pt1 = &x; 

     printf("Value at p1: %d\n", *pt1); 
     printf("Address of p1: %p\n", pt1); 

     return 0; 
    } 
+1

警告描述對我來說似乎很好。在將它發送到printf之前將其轉換爲void。而不是pt1,(void *)pt1​​ – Milan 2011-03-24 10:51:08

+0

嘗試向pt1添加一個&符號,看看它是否有效。 – Nocturnal 2011-03-24 10:51:25

回答

41

只要投你的INT指針空洞之一:

printf("Address of p1: %p\n", (void *)pt1); 

你的代碼是安全的,但你與-Wformat警告標誌,這將鍵入檢查printf()scanf()調用編譯。

+0

哦,好的。我是C新手,直到現在還沒有學會區分編譯器消息類型。謝謝。 – Chris 2011-03-24 10:57:47

+1

此行爲被gcc開發者確定爲有效,請參閱http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26542 另請參閱Jonathan Leffler的詳細解釋:http://stackoverflow.com/問題/ 9053658/correct-format-specifier-to-print-pointer-address – 2012-09-03 09:06:42

1

在這種情況下,編譯器只是有點警惕。您的代碼是完全安全的,可以有選擇地刪除與警告:

printf("Address of p1: %p\n", (void *) pt1); 
1

的消息說,這一切,但它只是一個警告不是錯誤本身:

printf("Address of p1: %p\n", (void*)pt1); 
10

注意,你會得到一個簡單的警告。您的代碼將可能按預期執行。

"%p"轉換說明符轉換爲printf需要參數void*; pt1int*的類型。

的警告是好的,因爲int*void*可能,在陌生的實現,有不同尺寸或位模式什麼

轉換的int*void*與投...

printf("%p\n", (void*)pt1); 

...一切都會好的,即使在陌生的實現。

+0

即使它們具有相同的大小,它們也可能在不同的調用約定下以不同的方式傳遞給被調用的函數。 – caf 2011-03-24 12:11:09

+0

謝謝@caf,回覆評論涵蓋** ALL **個案:) – pmg 2011-03-24 12:35:13