C Активация массива - распределение стека или кучи?
Я гарантирую, что этот вопрос задан раньше, но я не смог найти его через поиск; извините заранее за любые увольнения.
Это мое (потенциально неправильное) понимание того, что вы выделяете стек только тогда, когда вы знаете размер объекта во время компиляции. Поэтому в случае инициализации массива вы можете сделать одно из них (и это должно идти в стек):
char charArray[50];
Поскольку размер этого массива известен во время компиляции, это не должно иметь проблем.
С другой стороны, этот (я считаю) также действительный код:
char anotherCharArray[someVariable + 50];
Будет ли это идти и в стеке? Я уверен, что код segfaults, если вы освободите(), так что это заставляет меня думать, что это так, но для меня это не имеет смысла. Точно так же, 100% единственная ситуация, когда вам нужно использовать free(), когда данные были распределены через malloc?
Заранее благодарим за помощь.
Ответы
Ответ 1
Точно так же, 100% единственная ситуация, когда вам нужно использовать free(), когда данные были распределены через malloc?
Да. (Помимо calloc и realloc, их возвращаемое значение также должно быть free()
'd. Аналогичным образом существуют функции, которые используют malloc(), и этот факт документирован, например strdup()
- возвращаемое значение этих функций также для освобождения с помощью free()
, очевидно.)
char anotherCharArray[someVariable + 50];
Будет ли это идти и в стеке?
Да, это так (в большинстве реализаций - конечно, это не всегда так, как вы предполагаете, но на большинстве платформ оно есть). И да, это допустимый код, но он только стандартный на C99.
Ответ 2
Если char charArray[50];
определяется в области файлов (вне всех функций) или является static
, он не будет находиться в стеке, он будет глобальным, предварительно распределенным в начальной переменной программы. Если он не static
и определен в области видимости функции, он будет находиться в стеке.
char anotherCharArray[someVariable + 50];
может быть определен только в области видимости функции и будет находиться в стеке.
Все вышеизложенное относится к типичным реализациям C. Атипичные могут использовать кучу вместо стека и вместо предварительно выделенного пространства в разделе данных программы.
Вы не free()
то, что не было выделено с помощью malloc()
, calloc()
или realloc()
. Просто. Некоторые функции могут означать использование одного из указанных выше, например. POSIX strdup()
.