Определите размер динамично выделенной памяти в C

Вы, кажется, ищете существующий рефакторинг Inline Constant .

Не путать с рефакторингами Rename, кстати.

56
задан Community 19 August 2017 в 12:03
поделиться

8 ответов

Список часто задаваемых вопросов comp.lang.c · Вопрос 7.27 -

Q. Итак, могу ли я запросить пакет malloc , чтобы узнать, насколько велик выделенный блок?

A. К сожалению, стандартного или портативного способа не существует. (Некоторые компиляторы предоставляют нестандартные расширения.) Если вам нужно знать, вам придется следить за этим самостоятельно. (См. Также вопрос 7.28 .)

45
ответ дан 26 November 2019 в 17:15
поделиться

Я боролся недавно с визуализацией памяти, которая была доступна для записи в (т.е. использование strcat или strcpy, тип сразу функционирует после malloc).

Это не предназначено, чтобы быть очень техническим ответом, но он мог помочь Вам при отладке, так, как он помог мне.

можно использовать размер Вы malloc d в memset, установить произвольное значение для второго параметра (таким образом, можно распознать его), и используйте указатель, который Вы получили от malloc.

Как так:

char* my_string = (char*) malloc(custom_size * sizeof(char));
if(my_string) { memset(my_string, 1, custom_size); }

можно тогда визуализировать в отладчике, как выделенная память похожа: enter image description here

0
ответ дан 26 November 2019 в 17:15
поделиться

Если вы используете malloc, вы не можете получить размер.

С другой стороны, если вы используете OS API для динамического выделения памяти, как функции кучи Windows , тогда это возможно.

1
ответ дан 26 November 2019 в 17:15
поделиться

Как все уже сказали: Нет, не существует.

Кроме того, я бы всегда избегал здесь всех функций, зависящих от поставщика, потому что, когда вы обнаружите, что вам действительно нужно их использовать , это обычно признак того, что вы делаете это неправильно. Размер следует либо хранить отдельно, либо не знать его вовсе. Использование функций поставщика - это самый быстрый способ потерять одно из главных преимуществ написания на C - переносимость.

3
ответ дан 26 November 2019 в 17:15
поделиться

Нет, библиотека времени выполнения C не предоставляет такую ​​функцию.

Некоторые библиотеки могут предоставлять специфичные для платформы или компилятора функции, которые могут получать эту информацию, но обычно способ отслеживания этой информации находится в другой целочисленной переменной.

7
ответ дан 26 November 2019 в 17:15
поделиться

Менталитет языка Си заключается в том, чтобы предоставить программисту инструменты, помогающие ему в его работе, а не предоставлять абстракции, которые изменяют характер его работы. C также пытается избежать упрощения / безопасности, если это происходит за счет ограничения производительности.

Для некоторых вещей, которые вы могли бы сделать с областью памяти, требуется только расположение начала области. Такие вещи включают в себя работу со строками с завершающим нулем, манипулирование первыми n байтами области (если известно, что область по крайней мере такая большая) и т. Д.

В основном, отслеживание длина региона - это дополнительная работа, и если бы C делал это автоматически, он иногда делал бы это без необходимости.

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

Да, реализации malloc () обычно отслеживают размер региона, но они могут делать это косвенно, или округлять его до некоторого значения, или нет. держите его вообще. Даже если они его поддерживают, определение размера таким способом может быть медленным по сравнению с отслеживанием его самостоятельно.

Если вам нужна структура данных, которая знает, насколько велика каждая область, C может сделать это за вас. Просто используйте структуру, которая отслеживает размер региона, а также указатель на него.

Реализации malloc () обычно отслеживают размер региона, но могут делать это косвенно, округлять до некоторого значения или не сохранять его вообще. Даже если они его поддерживают, определение размера таким способом может быть медленным по сравнению с отслеживанием его самостоятельно.

Если вам нужна структура данных, которая знает, насколько велика каждая область, C может сделать это за вас. Просто используйте структуру, которая отслеживает размер региона, а также указатель на него.

Реализации malloc () обычно отслеживают размер области, но могут делать это косвенно, округлять до некоторого значения или не сохранять его вообще. Даже если они его поддерживают, определение размера таким способом может быть медленным по сравнению с отслеживанием его самостоятельно.

Если вам нужна структура данных, которая знает, насколько велика каждая область, C может сделать это за вас. Просто используйте структуру, которая отслеживает размер региона, а также указатель на него.

11
ответ дан 26 November 2019 в 17:15
поделиться

Стандартного способа найти эту информацию не существует. Однако некоторые реализации для этого предоставляют такие функции, как msize . Например:

Имейте в виду, однако, что malloc будет выделять минимум запрошенного размера , поэтому вам следует проверить, действительно ли вариант msize для вашей реализации возвращает размер объекта или память, фактически выделенную в куче.

44
ответ дан 26 November 2019 в 17:15
поделиться

Я ожидал, что это будет зависеть от реализации.
Если у вас есть структура данных заголовка, вы можете вернуть ее на указатель и получить размер.

2
ответ дан 26 November 2019 в 17:15
поделиться
Другие вопросы по тегам:

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