2014-06-15 97 views
0

我很困惑!以下所有printf都是打印函數地址的正確方法? 讓我告訴你我的困惑。每次我運行所有這些的printf的(也就是第一個printf的,第二個printf和第三的printf)的,在輸出我得到 02D4 02D4 02D4 但如果我刪除或第一和第二的printf的評論,我得到如下因素作爲輸出 02BA 當我刪除第三printf語句,我得到下面的輸出 02D0 當我再次取消註釋所有這三個,我得到: 02D4 02D4 02D4 爲什麼一個語句影響其他的printf線的輸出? 這不是功能的地址嗎? 我聽說s和& s給出了與地址相同的值(就像數組一樣)。但在這裏我很困惑,爲什麼s和& s受到影響,當我嘗試打印b也是,其中b = s或& s。與功能地址混淆c

#include<stdio.h> 
#include<conio.h> 
int s(int); 
void main() 
{ 
int a=10,*b; 
clrscr(); 
b=s(a++); 
b=&s; 
printf("%p\n",s);  // 1st printf 
printf("%p\n",&s);  //2nd printf 
printf("%p\n",b);  //3rd printf 
getch(); 
} 
int s(int x) 
{ 
return x; 
} 
+2

你不應該把一個函數指針放入一個變量指針(它們不能保證是相同的大小),但除此之外它看起來沒問題。 C語言的一個特例是沒有'&'的函數名稱隱式獲得(我個人更喜歡總是使其明確) – Dave

+2

(儘管如此,就像不應該將函數指針轉換爲變量指針,你不應該使用'%p'格式。看到這個答案是一個安全的方式來打印一個函數指針:http://stackoverflow.com/a/2741896/1180785) – Dave

+1

至於爲什麼你的地址改變,這是因爲你正在重新編譯腳本!即使您完全沒有對代碼進行任何更改,它們在編譯之間也可能會有所不同。 – Dave

回答

2

因爲編譯器和操作系統都可能影響結束位置,所以變量或函數的地址不是您可以依賴的。

但假設操作系統總是加載您的可執行代碼在同一個地址,如果你改變的代碼長度在main()功能,這很可能影響s()功能的起始地址。因此,你會得到不同的結果。

+0

謝謝@DWWATSON,我明白了 – gj1103