2012-04-28 101 views
1

我測試了一個寫在下面的小程序。我的問題是爲什麼指向一個值的指針和指向第一個指針的指針之間存在12個字節的差異。但是如果查看其他指針地址只有每一個再寄一次執行該程序多次,始終我看到這個difference.Can誰能解釋我可能是什麼原因在此先感謝8個字節的區別..指針地址值的變化

#include<stdio.h> 
#include<stdlib.h> 

int main(void) 
{ 
     int val; 
     int *ptr; 
     int **ptrptr; 
     int ***ptrptrptr; 
     int ****ptrptrptrptr; 
     int *****ptrptrptrptrptr; 

     val=10; 
     ptr=&val; 
     ptrptr=&ptr; 
     ptrptrptr=&ptrptr; 
     ptrptrptrptr=&ptrptrptr; 
     ptrptrptrptrptr=&ptrptrptrptr; 

     printf("Value-%d\n",val); 
     printf("Value address - %d\n",ptr); 
     printf("Pointer address - %d\n",ptrptr); 
     printf("Pointer Pointer Address -%d\n",ptrptrptr); 
     printf("Pointer Pointer Pointer Address -%d\n",ptrptrptrptr); 
     printf("Pointer Pointer Pointer Pointer Address -%d\n",ptrptrptrptrptr); 

     return 0; 
} 

的結果是?

Value-10 
Value address - -1308521884 
Pointer address - -1308521896 
Pointer Pointer Address --1308521904 
Pointer Pointer Pointer Address --1308521912 
Pointer Pointer Pointer Pointer Address --1308521920 
+1

Whay編譯器,什麼鏈接器,什麼處理器? 32或64位?什麼是整數?它有多大?它真的很重要嗎?我的意思是,你甚至注意到了什麼? – 2012-04-28 21:31:29

+1

有趣的是,將第一個int更改爲long可以像您期望的那樣工作。 – strkol 2012-04-28 21:51:18

+0

雅它長時間工作...... :) – Teja 2012-04-28 21:55:55

回答

4

這只是您的編譯器選擇的堆棧佈局, F.E.這可能是出於對齊的原因。事情很可能仍然適用於其他佈局。

請注意,您應該使用%p來打印地址。

+0

是%p將int地址轉換爲hexa..hope我是正確的..但仍然是什麼原因棧採取這樣的地址... – Teja 2012-04-28 21:33:39

+0

@Vutukuri堆棧佈局不是固定的,也不是標準。每個編譯器都有絕對的自由選擇如何安排局部變量。傳遞參數是另一個故事('cdecl','stdcall')。 – cnicutar 2012-04-28 21:34:54

+0

好吧,所以你的意思是說,如果我在diff編譯器上執行相同的程序,我可能會得到差異結果? – Teja 2012-04-28 21:38:24