Я новичок в программировании и получаю это сообщение об ошибке при запуске программы на C++:
zsh: ошибка сегментации ./a.out
Вот код:
#include <iostream>
using namespace std;
int main(){
int i;
int numElements;
std::cout << "Enter the number of elements for the array: ";
std::cin >> numElements;
int myArray[numElements];
std::cout << "Enter " << numElements << " numbers." << std::endl;
for (i = 0; i < numElements; ++i) {
std::cout << "Value: ";
std::cin >> myArray[i];
}
for (i = numElements; numElements >= 0; --i) {
std::cout << myArray[i] << " ";
}
return 0;
}
Вот терминал с сообщением об ошибке: введите сюда описание изображениявведите сюда описание изображения
Я попытался добавить оператор для печати массива после первого цикла for, но он не отобразился в терминале. Таким образом, проблема, похоже, возникает во время или до первого цикла for.
for (i = numElements; ..... после массива будет прочитана 1. Должно быть (i = numElements -1;
int myArray[numElements];` это НЕ стандарт C++, в подобных случаях следует использовать std::vector<int>
. В текущем C++ вам следует по возможности избегать индексов (чтобы не выходить за пределы вашего массива). Тогда прямая итерация становится for (int& values : myArray)
, а обратная итерация for (const int value : myArray | std::views(reverse))
(см. диапазон на основе циклов for. Возможно, источник, который вы изучаете, C++, не очень хороший: попробуйте Learncpp.com
Здесь for (i = numElements; numElements >= 0; --i) { std::cout << myArray[i] << " "; }
переменная i
слишком велика для массива, так и должно быть for (i = numElements - 1; ...
Вы уверены, что numElements >= 0
является правильным условием для вашего последнего цикла for?
Посмотрите, сможете ли вы включить несколько дезинфицирующих средств. Пример: godbolt.org/z/44fb17WWP
У вас есть ошибки в коде.
В частности, ваш цикл печати массива неверен:
for (i = numElements; numElements >= 0; --i) {
std::cout << myArray[i] << " ";
}
В приведенном выше коде есть 2 ошибки:
numElements >= 0
не имеет смысла. Это условие никогда не меняется, поэтому цикл будет выполняться бесконечно и непрерывно уменьшаясь i
. Когда i
получает отрицательные значения, ваш код совершает недопустимые действия и имеет так называемое неопределенное поведение. На данный момент он может сделать что угодно, включая начало Третьей мировой войны. Но обычно это приводит к ошибке сегментации (и именно это и происходит). Вы хотите сравнивать i
, а не numElements
. Но сначала проверьте пункт 2 ниже.i
== numElements
, а действительными индексами являются: 0, 1, ... nuElements-1
. numElements
выходит за пределы длины этого массива. Это также неопределенное поведение.ПС. код не является допустимым C++. Это расширение Gnu C++, которое не является переносимым. Лучше используйте std::vector<int>
для таких случаев.
Этот вопрос похож на: Array[n] vs Array[10] — инициализация массива переменной или числового литерала. Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему.