C ++ / Разрешено ли изменять размер статического массива или нет?

Согласно правильному ответу в Статический массив против динамического массива в 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;
}

Означает ли это, что размер статического массива можно изменить?

2

Решение

Вы на самом деле не увеличиваете массив. Давайте посмотрим ваш код подробно:

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 ++ границы массивов не проверяются. Вы не получили ни ошибки, ни предупреждения в основном из-за этого. Но опять же, доступ к элементам за пределами массива является неопределенным поведением. Неопределенное поведение означает, что это ошибка, которая может появиться не сразу. Даже программа, очевидно, может закончиться без проблем.

Надеюсь это поможет.

5

Другие решения

Нет, в аду нет шансов. Все, что вы сделали, — это незаконный доступ к нему за его пределами. Тот факт, что это не приводит к ошибке для вас, совершенно не имеет значения. Это полностью UB.

7

Во-первых, это не статический массив, это массив, выделенный в автоматическое хранение.

Далее

myArray[4];

не является новым объявлением, это отброшенное чтение из элемента # 4 ранее объявленного двухэлементного массива — неопределенное поведение.

Задания, которые следуют

myArray[2] = 2;
myArray[3] = 3;

запись в память, которая не выделена для вашей программы — также неопределенное поведение.

5
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector