Адрес массива по сравнению с адресом массива [0] - язык C

Мой вопрос состоит в том, почему делает адрес массива, отличаются от адреса его первого положения?

Я пытаюсь записать свой собственный 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] является некоторым случайным адресом каждый раз. Я ожидал, что адреса будут соответствовать друг другу. Кто-либо может объяснить, почему это не имеет место?

5
задан Matt 3 July 2013 в 17:06
поделиться

3 ответа

& mallocbuff - это адрес именованной переменной mallocbuff . & mallocbuff [0] - это адрес первого элемента в буфере, на который указывает mallocbuff , который вы выделили с помощью malloc () .

13
ответ дан 18 December 2019 в 06:22
поделиться

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)
8
ответ дан 18 December 2019 в 06:22
поделиться

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

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

4
ответ дан 18 December 2019 в 06:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: