Указатель структуры не предоставляет правильный размер в методе sizeof () - PullRequest
0 голосов
/ 25 октября 2011

У меня проблема с получением размера структурного указателя после выделения памяти с помощью malloc или realloc. Я работал над этим, отслеживая память в отдельном счетчике, но я хотел бы знать, является ли это ошибкой или есть способ правильно запросить размер указателя структуры.

Пример кода демонстрирует, что независимо от того, сколько памяти я выделяю для указателя структуры, он всегда возвращает 4 при запросах с использованием метода sizeof ().

typedef struct {
    int modelID;
    int bufferPosition;
    int bufferSize;
} Model;

Model *models = malloc(10000 * sizeof(Model));

NSLog(@"sizeof(models) = %lu", sizeof(models)); //this prints: sizeof(models) = 4

Ответы [ 4 ]

3 голосов
/ 25 октября 2011

4 - правильный ответ, потому что «models» - это указатель, а указатели - 4 байта. Вы не сможете найти длину массива таким образом. По какой причине вы не используете NSArray?

1 голос
/ 25 октября 2011

Если я вас правильно понимаю, вы хотите получить размер выделенного буфера.

sizeof, если неверный путь, поскольку он оценивается во время компиляции.Размер буфера является концепцией времени выполнения.

Вам понадобится способ запросить вашу библиотеку C, чтобы вернуть размер выделения для указателя на буфер.

В некоторых системах есть способполучить такую ​​информацию, например malloc_size в Mac OS.

1 голос
/ 25 октября 2011

4 - правильный ответ. Указатели указывают на область памяти, которая может содержать все, что угодно. Когда вы запрашиваете размер указателя, он дает размер ячейки памяти, в которой находится указатель, который в вашем случае равен 4.

Например

int *a = pointing to some large number;

int *b = pointing to a single digit number;

В вышеприведенном случае оба a и b имеют одинаковый размер независимо от того, на что они указывают.

Для получения дополнительной информации посмотрите этот пост размер указателя

0 голосов
/ 25 октября 2011

sizeof(myvar) вернет размер указателя. в 32-битной среде это равно 4 (байты). почему бы вам не использовать sizeof (Model) вместо этого?

...