我只是執行這個代碼示例:指針地址如何具有不同的長度?
int *i = (int*) malloc(sizeof(int));
printf("%p, %p\n", &i , i);
,這是我得到了什麼:
0x7fff38fed6a8, 0x10f7010
所以我不知道爲什麼是第二個地址比第一次短?
我只是執行這個代碼示例:指針地址如何具有不同的長度?
int *i = (int*) malloc(sizeof(int));
printf("%p, %p\n", &i , i);
,這是我得到了什麼:
0x7fff38fed6a8, 0x10f7010
所以我不知道爲什麼是第二個地址比第一次短?
i
在棧上,而它指向的內存塊在堆中。在你的平臺上這是兩個非常不同的內存區域,它只是恰巧堆addess是比較低的,數字,所以它有很多的前導零的未示出,即
&i = 0x7fff38fed6a8; // stack
i = 0x0000010f7010; // heap
沒有要求%p
格式化說明符將輸出填充到任何固定長度。因此,您無法從打印的表示中推斷任何有關內存「地址長度」的信息。舉例來說,如果你這樣做:
const void *nada = NULL;
printf("NULL is at %p\n", nada);
你可能會看到這樣的事情:
NULL is at 0x0
當然,這並不意味着void *
類型奇蹟般地只佔據4位當值是NULL
,它只是意味着當指針值轉換爲字符串時,前導零被忽略。
UPDATE:誤讀的問題的代碼,我刪除了不相關的文字。
i
是堆上的地址,而&i
是堆棧上的地址。堆和堆棧佔用不同的地址範圍,因此您會看到不同的數字。
指針並非實際上不同的長度:較短的指針前面是零。你可能在64位機器上運行它,所以每個指針都有64位(16位十六進制數字)。
它不短,只是數字較小。指針&我在棧上,我在堆上。
@PaulR:D'oh,誤解了問題的代碼。謝謝,並修復! – unwind