Адрес проживания и адрес массив[0] - язык C
Мой вопрос в том, почему адрес массива отличается от адреса его первой позиции?
Я пытаюсь написать свой собственный Мэллок, но для начала я просто выделяю кусок памяти и играю с адресами. Мой код выглядит примерно так:#define BUFF_SIZE 1024
static char *mallocbuff;
int main(){
mallocbuff = malloc(BUFF_SIZE);
printf("The address of mallocbuff is %dn", &mallocbuff);
printf("The address of mallocbuff[0] is %dn", &mallocbuff[0]);
}
&mallocbuff - один и тот же адрес каждый раз, когда я его запускаю. &mallocbuff[0] - это каждый раз какой-то случайный адрес. Я ожидал, что адреса совпадут. Может ли кто-нибудь объяснить, почему это не так? случае?
3 ответа:
&mallocbuff
является адресом именованной переменнойmallocbuff
.&mallocbuff[0]
- это адрес первого элемента в буфере, на который указываетmallocbuff
, выделенный с помощьюmalloc()
.
mallocbuff - это не массив, а указатель. Он хранится совершенно отдельно от того, где находится Мэллок.
Это даст ожидаемые результаты (и по мере необходимости):
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)