分段错误:Zsh:分段错误./a.out

问题描述 投票:0回答:1

我是编码新手,当我运行 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 循环之时或之前。

c++ arrays segmentation-fault
1个回答
0
投票

您的代码中存在错误。

特别是您的数组打印循环不正确:

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

上面的代码有2个bug:

  1. numElements >= 0
    毫无意义。这个条件永远不会改变,因此循环将无限地持续递减
    i
    。当
    i
    获得负值时,您的代码会执行非法操作并具有所谓的 未定义行为。此时它可能会采取任何行动,包括发动第三次世界大战。但通常它会导致分段错误(这就是它的作用)。
  2. 在第一次迭代中,您访问的数组超出其末尾:您正在访问索引
    i
    ==
    numElements
    ,而有效索引为:
    0, 1, ... nuElements-1
    numElements
    超出了该数组长度。这也是一种未定义的行为。

PS。该代码不是有效的 C++。它是 Gnu C++ 扩展,不可移植。对于这种情况,最好使用

std::vector<int>

© www.soinside.com 2019 - 2024. All rights reserved.