Используя sizeof с динамично выделенным массивом

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. Я знаю, что символ* составляет только 4 байта. Однако я выделил память для 10 КБ. Таким образом, разве размер не должен быть 10240? Я задаюсь вопросом, я думаю прямо здесь?

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

8
задан ant2009 28 April 2010 в 06:00
поделиться

5 ответов

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

16
ответ дан 3 November 2019 в 13:09
поделиться

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

2
ответ дан 3 November 2019 в 13:09
поделиться

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

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

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

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

9
ответ дан 3 November 2019 в 13:09
поделиться

Нет. буфер представляет собой 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
ответ дан 3 November 2019 в 13:09
поделиться

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

3
ответ дан 3 November 2019 в 13:09
поделиться
Другие вопросы по тегам:

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