6

我的问题是为什么数组的地址与其第一个位置的地址不同?

我正在尝试编写自己的 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] 每次都是一些随机地址。我期待地址相互匹配。谁能解释为什么不是这样?

4

3 回答 3

13

&mallocbuff是命名变量的地址mallocbuff。是您分配给&mallocbuff[0]的 指向的缓冲区中第一个元素的地址。mallocbuffmalloc()

于 2010-04-24T17:01:34.897 回答
9

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)
于 2010-04-24T17:03:15.610 回答
5

当您获取mallocbuf(via &mallocbuf) 的地址时,您不会获得数组的地址 - 您获得的是指向数组的变量的地址。

如果您想要数组的地址,只需使用mallocbuf它自己(在第一个printf())。这将返回与&mallocbuf[0]

于 2010-04-24T17:03:21.370 回答