Согласно правильному ответу в Статический массив против динамического массива в C ++ статические массивы имеют фиксированные размеры.
Тем не менее, это компилируется и работает просто отлично:
int main(int argc, char** argv) {
int myArray[2];
myArray[0] = 0;
myArray[1] = 1;
cout<<myArray[0]<<endl;
cout<<myArray[1]<<endl;
myArray[4];
myArray[2] = 2;
myArray[3] = 3;
cout<<myArray[2]<<endl;
cout<<myArray[3]<<endl;
return 0;
}
Означает ли это, что размер статического массива можно изменить?
Вы на самом деле не увеличиваете массив. Давайте посмотрим ваш код подробно:
int myArray[2];
myArray[0] = 0;
myArray[1] = 1;
Вы создаете массив из двух позиций с индексами от 0 до 1. Пока все хорошо.
myArray[4];
Вы получаете доступ к пятому элементу в массиве (элемент, который, безусловно, не существует в массиве). Это неопределенное поведение: все может случиться. Вы ничего не делаете с этим элементом, но это не важно.
myArray[2] = 2;
myArray[3] = 3;
Теперь вы получаете доступ к элементам три и четыре и меняете их значения. Опять же, это неопределенное поведение. Вы меняете ячейки памяти рядом с созданным массивом, но «больше ничего». Массив остается прежним.
На самом деле, вы можете проверить размер массива, выполнив:
std::cout << sizeof( myArray ) / sizeof( int ) << std::endl;
Вы проверите, что размер массива не изменился. Кстати, этот прием работает в той же функции, в которой объявлен массив, как только вы передаете его, он распадается в указатель.
В C ++ границы массивов не проверяются. Вы не получили ни ошибки, ни предупреждения в основном из-за этого. Но опять же, доступ к элементам за пределами массива является неопределенным поведением. Неопределенное поведение означает, что это ошибка, которая может появиться не сразу. Даже программа, очевидно, может закончиться без проблем.
Надеюсь это поможет.
Нет, в аду нет шансов. Все, что вы сделали, — это незаконный доступ к нему за его пределами. Тот факт, что это не приводит к ошибке для вас, совершенно не имеет значения. Это полностью UB.
Во-первых, это не статический массив, это массив, выделенный в автоматическое хранение.
Далее
myArray[4];
не является новым объявлением, это отброшенное чтение из элемента # 4 ранее объявленного двухэлементного массива — неопределенное поведение.
Задания, которые следуют
myArray[2] = 2;
myArray[3] = 3;
запись в память, которая не выделена для вашей программы — также неопределенное поведение.