Array For Loop - Превышено значение

0

Я начинаю узнавать о массивах в C++, и я не могу понять, почему массив продолжается после того, как цикл был превышен, а также возвращаемые значения.

int array[5] = {0, 1, 2, 3, 4}
int i;
i=0;
for (i=0, i < 9, i+=2)
{
    printf("%d ", array [i]);
}

Почему массив печатает значения 0 или случайных чисел после 4?

* Я понимаю, что распечатываю 1-й, 3-й, 5-й, 7-й и 9-й номера

  • 0
    Отсутствует тело цикла в вашем вопросе.
  • 2
    Вы входите в неопределенную территорию поведения. Все идет и ничего не обещано. Это может сработать, оно может разбиться и сгореть. stackoverflow.com/q/367633/477563
Показать ещё 4 комментария
Теги:
for-loop

4 ответа

1

Вы печатаете 1-й, 3-й, 5-й, 7-й и 9-й номера массива, который имеет только 5 номеров.

После того, как вы выходите за пятое число, вы печатаете неопределенные значения из памяти, которые не принадлежат вашему массиву.

Почему цикл продолжается за пределами фактической длины массива? Потому что вы сказали это, и C++ позволит это.

  • 0
    Он мог печатать четко определенные значения из параллельной вселенной, насколько вы знаете.
0

Поскольку синтаксис индекса массива является просто ярлыком для указателя math:

array[i]

Такой же как:

*(array + i)

В вашем случае, когда математика работает с адресом в памяти, который существует, адресуется вашей программой и содержит некоторые случайные данные.

Доступ к этим данным известен как ошибка переполнения буфера.

0

Массив в C++ в основном представляет собой синтаксическую оболочку вокруг указателя и смещения. Переменная массива может быть передана одному аргументу указателя.

array[i]

такой же как

*(array + i)

C++ не выполняет проверку границ массивов для вас, как это делает Java или С#. Принцип C++ заключается в том, что язык не делает ничего, о чем вы не просили. Проверка того, что вы обращаетесь к массиву за пределами границ и бросаете исключение, добавляет накладные расходы, что необязательно, если вы знаете, что получите доступ в границах.

Когда вы получаете доступ к памяти границ, которая по-прежнему доступна вашему приложению, вы получаете неинициализированную память.

Вы можете запрограммировать правильное количество элементов в вашем массиве или для того же кода, который вы могли бы использовать std :: vector, и проверить размер():

#include <vector>

std::vector<int> vals = {0, 1, 2, 3, 4};
for (int i=0, i < vals.size(), i+=2)
{
    printf("%d ", array [i]);
}
-2

Я разработчик С#, но мне кажется, что у вас есть массив с 5 элементами, и вы пытаетесь напечатать элементы, которые не существуют. Попробуйте изменить свой исходный оператор на: int array [9] = {0,1,2,3,4,5,6,7,8,9} и посмотреть, работает ли это.

  • 0
    Что такого плохого в этом ответе, что меня обманывают? Кто-то уже упоминал, что поведение было неопределенным (правильным). Поэтому я просто сказал, что нужно сделать, чтобы исправить это (вместо того, чтобы дублировать этот ответ). Может быть, я должен просто перестать помогать ....

Ещё вопросы

Сообщество Overcoder
Наверх
Меню