Адрес массива против адреса массива [0] - язык C - PullRequest
4 голосов
/ 24 апреля 2010

Мой вопрос: почему адрес массива отличается от адреса его первой позиции?

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

Ответы [ 3 ]

13 голосов
/ 24 апреля 2010

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

8 голосов
/ 24 апреля 2010

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)
4 голосов
/ 24 апреля 2010

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

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

...