Ошибка сегментации: Zsh: ошибка сегментации ./a.out

Я новичок в программировании и получаю это сообщение об ошибке при запуске программы на 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.

Этот вопрос похож на: Array[n] vs Array[10] — инициализация массива переменной или числового литерала. Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему.

Andrew Yim 30.06.2024 07:23

for (i = numElements; ..... после массива будет прочитана 1. Должно быть (i = numElements -1;

Serve Laurijssen 30.06.2024 07:41

int myArray[numElements];` это НЕ стандарт C++, в подобных случаях следует использовать std::vector<int>. В текущем C++ вам следует по возможности избегать индексов (чтобы не выходить за пределы вашего массива). Тогда прямая итерация становится for (int& values : myArray), а обратная итерация for (const int value : myArray | std::views(reverse)) (см. диапазон на основе циклов for. Возможно, источник, который вы изучаете, C++, не очень хороший: попробуйте Learncpp.com

Pepijn Kramer 30.06.2024 07:49

Здесь for (i = numElements; numElements >= 0; --i) { std::cout << myArray[i] << " "; } переменная i слишком велика для массива, так и должно быть for (i = numElements - 1; ...

john 30.06.2024 07:58

Вы уверены, что numElements >= 0 является правильным условием для вашего последнего цикла for?

Alan Birtles 30.06.2024 08:24

Посмотрите, сможете ли вы включить несколько дезинфицирующих средств. Пример: godbolt.org/z/44fb17WWP

user4581301 30.06.2024 08:32
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас есть ошибки в коде.

В частности, ваш цикл печати массива неверен:

for (i = numElements; numElements >= 0; --i) {
    std::cout << myArray[i] << " ";
}

В приведенном выше коде есть 2 ошибки:

  1. numElements >= 0 не имеет смысла. Это условие никогда не меняется, поэтому цикл будет выполняться бесконечно и непрерывно уменьшаясь i. Когда i получает отрицательные значения, ваш код совершает недопустимые действия и имеет так называемое неопределенное поведение. На данный момент он может сделать что угодно, включая начало Третьей мировой войны. Но обычно это приводит к ошибке сегментации (и именно это и происходит). Вы хотите сравнивать i, а не numElements. Но сначала проверьте пункт 2 ниже.
  2. на первой итерации вы получаете доступ к своему массиву за пределами его конца: вы получаете доступ к индексу i == numElements, а действительными индексами являются: 0, 1, ... nuElements-1. numElements выходит за пределы длины этого массива. Это также неопределенное поведение.

ПС. код не является допустимым C++. Это расширение Gnu C++, которое не является переносимым. Лучше используйте std::vector<int> для таких случаев.

Другие вопросы по теме