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? Я задаюсь вопросом, я думаю прямо здесь?
Большое спасибо за любые предложения,
Вы запрашиваете размер char *
, который на самом деле равен 4, а не размер буфера. Оператор sizeof
не может возвращать размер динамически выделяемого буфера, только размер статических типов и структур, известных во время компиляции.
Замените свой sizeof
на malloc_usable_size
(справочная страница указывает, что это непереносимый, поэтому не может быть доступно с вашей конкретной реализацией C).
sizeof
не работает с динамическими выделениями (за некоторыми исключениями в C99). Вы используете здесь sizeof
, чтобы получить размер указателя. Этот код даст вам желаемый результат:
char buffer[10240];
printf("sizeof(buffer) [ %d ]\n", sizeof(buffer));
Если malloc ()
завершится успешно, указанная память будет не меньше, чем вы просили, поэтому нет причин беспокоиться о фактический размер, который он выделил.
Кроме того, вы выделили 10 КБ, а не 1 КБ.
Нет. буфер
представляет собой 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
изменился бы в приведенном выше коде, что не имеет смысла для константы времени компиляции.
Вы сами должны отслеживать размер памяти, если вам это нужно. Память, возвращаемая malloc, является только указателем на "неинициализированные" данные. Оператор sizeof работает только с переменной buffer
.