Случай первый: Если я размещу полностью неинициализированный массив в теле функции, то где он будет размещён?
Я думаю, что он будет размещён целиком в стеке.
Случай второй: Если я размещу полностью неинициализированный массив вне функции, то где он будет размещён?
Я думаю, что он будет размещён в BSS секции, но вне стека.
Случай пятый: Если я размещу частично инициализированный массив в функции, то где будут размещены инициализированная и неинициализированная части?
Я думаю, что инициализированная часть будет располагаться в секции data/rodata, а инициализированная часть в стеке?
Случай четвёртый: Если я размещу частично инициализированный массив вне функции, то где будут размещены инициализированная и неинициализированная части?
где будут размещены инициализированная и неинициализированная части?
Массив - это непрерывный кусок памяти, так что обе части будут в одном и том же месте.
Тоесть там же, где и "полностью неинициализированный массив вне функции".
А "частично инициализированный массив в функции" там же, где и "полностью неинициализированный массив в теле функции"
Ведь область стека при загрузке программы в память обнулена.
Возможно первоначально стек и обнулен, я тут не в курсе, но на это рассчитывать не стоит, т.к. стек постоянно меняется и ты не можешь гарантировать, что вот эта конкретная переменная попадет в "обнуленную" область стека, которая не была еще использована. Когда из стека "выталкиваются" (pop) данные, то память в стеке никак не изменяется, просто уменьшается (увеличивается) указатель стека. Поэтому стек всегда содержит огрызки данных предыдущих вызовов и размещенных там переменных.
И даже в main нет такой гарантии, т.к. до main выполняется куча кода стандартной библиотеки. На самом деле точкой входа в программу является вовсе не мейн. Если я правильно помню, то точкой входа в программу является _start, которая спрятана внутри стандартной библиотеки.
Массив не может быть частично инициализированным. Он либо не инициализирован (но память выделена), либо инициализирован. Все элементы, которые вы в явном виде не инициализируете, будут заполнены нулями компилятором.
Не инициализированные глобальные и статические данные лежат в сегменте bss.
Инициализированные - в data.
Локальные переменные функций лежат на стеке, не зависимо от того инициализированы он или нет. Код инициализации встраивается в код функции компилятором.
Динамические данные лежат в куче.
1 обычные неинициализированные переменные в функции размещаются на стеке. Если есть возможность, могут быть размещены в регистрах. При ключевом слове static размещается в bss. При ключевом слове const размещается в rodata. То же касается и массивов, разве что в регистрах вряд ли разместятся (хотя, мало ли какие архитектуры могут быть).
2 глобальные неинициализированные массивы размещаются в bss, const - в rodata.
5 массив будет храниться на стеке, при входе в функцию инициализироваться данными из rodata. Массивы неразрывные и однородные, его части не могут быть разного типа хранения. Тут тоже надо иметь в виду, что const будет лежать в rodata, static - в data
4 как сказал, массив однородный и неразрывный, глобальный инициализированный будет весь в data.