Я новичок и начал кодировать пару дней назад. Итак, сегодня начал с массива и есть некоторые сомнения. Я читаю массив, получая ввод от пользователя и отображая его, все работает нормально, но на экране вывода у меня есть значение мусора, и я не знаю, почему. Пожалуйста, помогите мне.
#include <iostream>
using namespace std;
int main(){
int number;
cout<<"Enter a array_size"<<endl;
cin>>number;
//Reading and printing array
int array[number];
int i=1;
while(i<=number){
cin>>array[i];
i++;
}
//printing array
int j=0;
while(j<=number){
cout<<array[j]<<endl;
j++;
}
}
Ожидаемый результат: Чтение от пользователя: 3
1
2
3
//displaying
1
2
3
Фактический результат: Чтение от пользователя: 3
1
2
3
16
1
2
3
Почему отображается 16?
Вы пишете из индекса 1 и читаете из индекса 0. Кроме того, вы получаете доступ к одному из последних элементов. В конце концов, проверьте комментарий PaulMcKenzie.
Индексы массива начинаются с 0, а не с 1.
Может быть, я неправильно понял ваш вопрос: Ваш реальный вопрос: почему я вижу 16 вместо какой-то фигни?
Отвечает ли это на ваш вопрос? Доступ к массиву за пределами не выдает ошибки, почему?
Мне любопытно, откуда вы узнали, что int array[number]; (number — это переменная) допустимо в C++? Где бы это ни было, имейте в виду, что это не учит вас правильному С++.
Сделайте себе одолжение и забудьте, что массивы в стиле C существуют в языке и вместо этого используют исключительно std::array и std::vector.
Ваш код имеет неопределенное поведение из-за того, что индексация выходит за пределы. Компилятор не обязан это диагностировать, но это означает, что ему разрешено выдавать любой результат, в том числе то, что вы ожидаете, что-то, чего вы не ожидали, сбой, отсутствие вывода вообще и т.д. - разрешено буквально все. C++ не держит вас за руку.
Выведите i во время первого цикла и j во время второго цикла и оцените разницу.





Индексы массива начинаются с 0, а не с 1.
Исправленный код:
//Reading and printing array
int array[number];
int i = 0;
while (i < number) {
cin >> array[i];
i++;
}
//printing array
int j = 0;
while (j < number) {
cout << array[j] << endl;
j++;
}
Здесь более идиоматично использовать цикл for:
//Reading and printing array
int array[number];
for (int i = 0; i < number; i++) {
cin >> array[i];
}
//printing array
for (int i = 0; i < number; i++) {
cout << array[j] << endl;
}
Массив всегда должен начинаться с индекса 0. Обновите начальный индекс и условия.
//Reading and printing array
int array[number];
int i=0; // should start with zero.
while(i<number){ // should be less than only since you start with zero.
cin>>array[i];
i++;
}
//printing array
int j=0;
while(j<number){ // should be less than only since you start with zero.
cout<<array[j]<<endl;
j++;
}
Это не стандартный С++. Обратитесь к хорошей книге по C++, чтобы узнать больше о массивах.
Есть 2 проблемы с вашим кодом.
Во-первых, int array[number]; не является стандартным С++, поскольку number не является константным выражением.
Во-вторых, индексы массива начинаются с 0, а не с 1 в C++.
Есть также много других сообщений, описывающих эти проблемы.
Индекс массива всегда начинается с 0
Почему обращение за пределы массива не выдает никакой ошибки
Как упоминалось в комментариях, C++ не поддерживает VLA (массивы переменной длины) — см. здесь: Почему массивы переменной длины не являются частью стандарта C++?.
Также уже упоминалось, что индексы массива начинаются с 0, а не с 1 (Индексация массива начинается с числа, а не с 0).
Вы можете избежать этих проблем, используя std::vector и циклы на основе диапазона (последний доступен, начиная с С++ 11).
Пример кода для вашего случая:
#include <iostream>
#include <vector>
int main()
{
int number;
std::cout << "Enter a array_size" << std::endl;
std::cin >> number;
// Read:
std::vector<int> array(number);
for (auto& elem : array)
{
std::cin >> elem;
}
// Print:
for (auto const & elem : array)
{
std::cout << elem << std::endl;
}
}
Обратите внимание, что auto elem : array (без &) не сработало бы, потому что auto сам по себе не вывел бы ссылку, а вместо этого скопировал бы элемент.
Примечание: лучше избегать using namespace std - см.: Почему "используя пространство имен std;" считается плохой практикой?.
int array[number];-- Это недопустимый C++. Размер массивов в C++ должен обозначаться константой времени компиляции, а не значением времени выполнения. Динамические массивы в C++ создаются с помощьюstd::vector:std::vector<int> array(number);. Смотрите это