数组的地址与数组[0]的地址 - C语言

时间:2010-04-24 16:57:43

标签: c arrays char malloc memory-address

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

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

3 个答案:

答案 0 :(得分:13)

&mallocbuff是命名变量mallocbuff的地址。 &mallocbuff[0]mallocbuff指向的缓冲区中第一个元素的地址,您使用malloc()分配了该地址。

答案 1 :(得分: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)

答案 2 :(得分:4)

当您获取mallocbuf的地址(通过&mallocbuf)时,您没有获得数组的地址 - 您将获得指向数组的变量的地址。

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

相同的值