Использование sizeof с динамически размещаемым массивом - PullRequest
8 голосов
/ 28 апреля 2010

gcc 4.4.1 c89

У меня есть следующий фрагмент кода:

#include <stdlib.h>
#include <stdio.h>

 char *buffer = malloc(10240);
 /* Check for memory error */
 if(!buffer)
 {
    fprintf(stderr, "Memory error\n");
    return 1;
 }
 printf("sizeof(buffer) [ %d ]\n", sizeof(buffer));

Тем не менее, sizeof (буфер) всегда печатает 4. Я знаю, что char * составляет всего 4 байта. Тем не менее, я выделил память на 10 КБ. Так не должен ли размер быть 10240? Мне интересно, я тут думаю?

Большое спасибо за любые предложения,

Ответы [ 5 ]

15 голосов
/ 28 апреля 2010

Вы запрашиваете размер char*, который в действительности равен 4, а не размер буфера. Оператор sizeof не может возвращать размер динамически выделяемого буфера, только размер статических типов и структур, известных во время компиляции.

9 голосов
/ 28 апреля 2010

sizeof не работает с динамическими распределениями (с некоторыми исключениями в C99). Ваше использование sizeof здесь просто дает вам размер указателя. Этот код даст вам желаемый результат:

char buffer[10240];
printf("sizeof(buffer) [ %d ]\n", sizeof(buffer));

Если malloc() завершится успешно, указанная память будет по крайней мере такой же большой, как вы просили, поэтому нет оснований беспокоиться о выделенном фактическом размере.

Кроме того, вы выделили 10 КБ, а не 1 КБ.

3 голосов
/ 28 апреля 2010

Нет. buffer является char *. Это указатель на char данные. Указатель занимает всего 4 байта (в вашей системе).

Указывает на 10240 байтов данных (что, кстати, не 1Кб. Больше похоже на 10Кб), но указатель не знает, что . Рассмотрим:

int a1[3] = {0, 1, 2};
int a2[5] = {0, 1, 2, 3, 4};

int *p = a1;
// sizeof a1 == 12 (3 * sizeof(int))
// but sizeof p == 4
p = a2
// sizeof a2 == 20
// sizeof p still == 4

Это главное различие между массивами и указателями. Если бы это не сработало, sizeof p изменится в приведенном выше коде, что не имеет смысла для константы времени компиляции.

3 голосов
/ 28 апреля 2010

Вы можете отслеживать размер памяти, если вам это нужно. Память, возвращаемая malloc, является только указателем на «неинициализированные» данные. Оператор sizeof работает только с переменной buffer.

2 голосов
/ 28 апреля 2010

Замените ваш sizeof на malloc_usable_size (страница руководства указывает, что это непереносимо, поэтому может быть недоступно в вашей конкретной реализации C).

...