Почему размер массива доступен, но размер динамически выделяемой памяти недоступен во время выполнения? - PullRequest
2 голосов
/ 13 июля 2020

Если я объявлю массив double x[n], где n - либо константа, либо переменная типа int, я могу получить его размер во время выполнения. Но если я выделяю память, используя malloc, этого не происходит. Это из-за выделения памяти из стека или кучи? Если да, то как определяются размеры массивов для глобальных переменных и почему я не могу объявить массивы переменной длины в качестве глобальных переменных? и как работает освобождение, если вам нужно знать, сколько памяти нужно освободить?

Ответы [ 2 ]

4 голосов
/ 13 июля 2020

Ответ практически на все ваши вопросы заключается в том, что распределитель памяти конфиденциально знает, сколько памяти он выделил, но не тип вашего объекта. Фактически, он может знать только то, сколько блоков определенного фиксированного размера он выделил, а не обязательно столько же, сколько запрошенных байтов. Следовательно, он не знает, сколько элементов содержит «массив», и даже если он вообще используется как массив. Это. Вы просто запрашиваете столько байтов, сколько вам нужно, а затем используете эту память по своему усмотрению. Распределитель не обязан помогать вам в этом, что дает вам полную гибкость, чтобы делать все, что вы хотите.

Массив x в вашем примере имеет известный тип и размер во время компиляции или может быть выводится во время выполнения. Другими словами, компилятор знает, что он должен поместить sh некоторое количество байтов в стек на основе значения размера и использовать их как массив определенного типа.

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

0 голосов
/ 13 июля 2020

Во время трансляции компилятор отслеживает все определения переменных и их размеры. За исключением VLA, оператор sizeof оценивается во время компиляции, а не во время выполнения. Как отслеживаются размеры VLA, зависит от конкретной реализации.

...