Адрес проживания и адрес массив[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 4

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)

Когда вы берете адрес mallocbuf (через &mallocbuf), Вы не получаете адрес массива - вы получаете адрес переменной, которая указывает на массив.

Если вам нужен адрес массива, просто используйте mallocbuf сам (в первом printf()). Это вернет то же значение, что и &mallocbuf[0]