我的问题是为什么数组的地址与其第一个位置的地址不同?
我正在尝试编写自己的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]每次都是一些随机地址。我期待地址相互匹配。任何人都可以解释为什么不是这样吗?
答案 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]