Мой вопрос состоит в том, почему делает адрес массива, отличаются от адреса его первого положения?
Я пытаюсь записать свой собственный 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] является некоторым случайным адресом каждый раз. Я ожидал, что адреса будут соответствовать друг другу. Кто-либо может объяснить, почему это не имеет место?
& mallocbuff
- это адрес именованной переменной mallocbuff
. & mallocbuff [0]
- это адрес первого элемента в буфере, на который указывает mallocbuff
, который вы выделили с помощью malloc ()
.
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)
Когда вы берете адрес mallocbuf
(через & mallocbuf
) вы не получаете адрес массива - вы получаете адрес переменной, которая указывает на массив.
Если вам нужен адрес массива, просто используйте сам mallocbuf
(в первом printf ()
). Это вернет то же значение, что и & mallocbuf [0]