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().