Я начинаю узнавать о массивах в 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-й номера
Вы печатаете 1-й, 3-й, 5-й, 7-й и 9-й номера массива, который имеет только 5 номеров.
После того, как вы выходите за пятое число, вы печатаете неопределенные значения из памяти, которые не принадлежат вашему массиву.
Почему цикл продолжается за пределами фактической длины массива? Потому что вы сказали это, и C++ позволит это.
Поскольку синтаксис индекса массива является просто ярлыком для указателя math:
array[i]
Такой же как:
*(array + i)
В вашем случае, когда математика работает с адресом в памяти, который существует, адресуется вашей программой и содержит некоторые случайные данные.
Доступ к этим данным известен как ошибка переполнения буфера.
Массив в 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]);
}
Я разработчик С#, но мне кажется, что у вас есть массив с 5 элементами, и вы пытаетесь напечатать элементы, которые не существуют. Попробуйте изменить свой исходный оператор на: int array [9] = {0,1,2,3,4,5,6,7,8,9} и посмотреть, работает ли это.