2010-04-24 57 views
4

我的問題是爲什麼數組地址與第一個地址不同?數組的地址與數組[0]的地址 - C語言

我想寫我自己的malloc,但開始我只是分配一塊內存和玩弄地址。我的代碼看起來大致是這樣的:

#define BUFF_SIZE 1024 
static char *mallocbuff; 

int main(){ 
    mallocbuff = malloc(BUFF_SIZE); 
    printf("The address of mallocbuff is %d\n", &mallocbuff); 
    printf("The address of mallocbuff[0] is %d\n", &mallocbuff[0]); 
} 

& mallocbuff是我每次運行它時相同的地址。 & mallocbuff [0]每次都是一些隨機地址。我期待地址相互匹配。任何人都可以解釋爲什麼不是這樣嗎?

+2

相同的值數組並不總是等同於指針,反之亦然。 – 2010-04-24 17:05:47

+0

不要使用'%d'打印地址。換句話說:mallocbuff ==&mallocbuff [0] – 2013-07-03 18:14:13

回答

13

&mallocbuff是指定變量mallocbuff的地址。 &mallocbuff[0]mallocbuff指向的緩衝區中第一個元素的地址,即您使用malloc()分配的地址。

+1

@對我來說可能已經太遲了。感謝您在我的帖子中糾正我。 – 2010-04-24 17:04:20

+0

@SB:使用'%p',並將地址轉換爲'void *':'printf(「%p \ n」,(void *)&whatever);' – 2010-04-24 17:05:21

8

mallocbuff不是數組,它是一個指針。它完全獨立於malloc分配的位置。

這會給你所期望的結果(根據需要):

int main(){ 
    char buf[1]; 
    printf("&buf  == %p\n", &buf); 
    printf(" buf  == %p\n", buf); // 'buf' implicitly converted to pointer 
    printf("&buf[0] == %p\n", &buf[0]); 

    char* mbuf = buf; 
    printf(" mbuf == %p\n", mbuf); 
    printf("&mbuf[0] == %p\n", &mbuf[0]); 

    printf("\n&mbuf(%p) != &buf(%p)\n", &mbuf, &buf); 

    return 0; 
} 

輸出:

&buf  == 0x7fff5b200947 
buf  == 0x7fff5b200947 
&buf[0] == 0x7fff5b200947 
mbuf == 0x7fff5b200947 
&mbuf[0] == 0x7fff5b200947 

&mbuf(0x7fff5b200948) != &buf(0x7fff5b200947) 
4

當你走的mallocbuf地址(通過&mallocbuf)你沒有得到的地址的數組 - 您正在獲取指向該數組的變量的地址。

如果你想要數組的地址只使用mallocbuf本身(在第一個printf())。這將返回與&mallocbuf[0]