LINUX.ORG.RU

История изменений

Исправление vodz, (текущая версия) :

Я спросил в чем неправ поповоду статической и динамической памяти. Просто жду когда скажут в где ж я неправильно понимаю.

Ладно. Допустим один раз, что вы просто тормозите.

Итак, статическая память:

int array1[5];
...
main()
{
    static int array2[5];
}

Тут компилятор выделит по 5 ячеек каждому массиву, если в этих ... точек других переменных больше не объявляется, то с большой вероятностью эта память будет статически (то есть без изменения в процессе работы) располагаться рядом, вначале идут 5 int-а для array1, а потом сразу же для array2, то есть записывая array1[5]=1 вы тем самым пишите в 0-ю ячейку array2, а не расширяете array1.

Выделение памяти из стека с константным или вычисляемым размером expr:

foo()
{
    int array3[expr];
}
Тут компилятор выделит память из стека в процессе выполнения, с размером, который может быть не константой в этом коде.

Выделение памяти из кучи под массив с константным или вычисляемым размером:

foo()
{
    int *A=new int[expr];
}

А теперь сравните с вашим первым постом. Вы выделили память на 5 ячеек, а используете больше. Не надо путать разные языки, там где массивы самостоятельно расширяются, там и предварительного выделения то как правило нет.

Исходная версия vodz, :

Я спросил в чем неправ поповоду статической и динамической памяти. Просто жду когда скажут в где ж я неправильно понимаю.

Ладно. Допустим один раз, что вы просто тормозите.

Итак, статическая память:

int array1[5];
...
main()
{
    static int array2[5];
}

Тут компилятор выделит по 5 ячеек каждому массиву, если в этих ... точек других переменных больше объявляется, то с большой вероятностью эта память будет статически (то есть без изменения в процессе работы) располагаться рядом, вначале идут 5 int-а для array1, а потом сразу же для array2, то есть записывая array1[5]=1 вы тем самым пишите в 0-ю ячейку array2, а не расширяете array1.

Выделение памяти из стека с константным или вычисляемым размером expr:

foo()
{
    int array3[expr];
}
Тут компилятор выделит память из стека в процессе выполнения, с размером, который может быть не константой в этом коде.

Выделение памяти из кучи под массив с константным или вычисляемым размером:

foo()
{
    int *A=new int[expr];
}

А теперь сравните с вашим первым постом. Вы выделили память на 5 ячеек, а используете больше. Не надо путать разные языки, там где массивы самостоятельно расширяются, там и предварительного выделения то как правило нет.