2012-05-15 79 views
1

我只是執行這個代碼示例:指針地址如何具有不同的長度?

int *i = (int*) malloc(sizeof(int)); 
printf("%p, %p\n", &i , i); 

,這是我得到了什麼:

0x7fff38fed6a8, 0x10f7010 

所以我不知道爲什麼是第二個地址比第一次短?

回答

5

i在棧上,而它指向的內存塊在堆中。在你的平臺上這是兩個非常不同的內存區域,它只是恰巧堆addess是比較低的,數字,所以它有很多的前導零的未示出,即

&i = 0x7fff38fed6a8; // stack 
i = 0x0000010f7010; // heap 
1

沒有要求%p格式化說明符將輸出填充到任何固定長度。因此,您無法從打印的表示中推斷任何有關內存「地址長度」的信息。舉例來說,如果你這樣做:

const void *nada = NULL; 

printf("NULL is at %p\n", nada); 

你可能會看到這樣的事情:

NULL is at 0x0 

當然,這並不意味着void *類型奇蹟般地只佔據4位當值是NULL,它只是意味着當指針值轉換爲字符串時,前導零被忽略。

UPDATE:誤讀的問題的代碼,我刪除了不相關的文字。

+0

@PaulR:D'oh,誤解了問題的代碼。謝謝,並修復! – unwind

4

i是堆上的地址,而&i是堆棧上的地址。堆和堆棧佔用不同的地址範圍,因此您會看到不同的數字。

指針並非實際上不同的長度:較短的指針前面是零。你可能在64位機器上運行它,所以每個指針都有64位(16位十六進制數字)。

1

它不短,只是數字較小。指針&我在棧上,我在堆上。

1

除其他答案:

由於您沒有包含<stdlib.h>,編譯器很可能錯誤地認爲malloc返回的結果是int而不是void*。這是一個可能嚴重的錯誤,你已經隱藏了malloc的返回值的類型轉換。閱讀thisthis

如果int的寬度與特定系統上的地址總線不同,例如在許多16位或64位CPU上,則會得到不正確的結果。