为什么这段代码会发出SIGSEGV的信号?

时间:2015-11-19 12:07:06

标签: c++ sigsegv

我到处搜索,不确定为什么7号阵列适用于6个索引,但6个不会。

#include <iostream>

using namespace std;


int main() {

    double rainRate[6];
    double averageRainfall = 0.0;

    for (unsigned int i = 0; i <= 6; i++) {
        cout << "Enter rainfall rate for day: " << i << endl;
        cin >> rainRate[i];

        if ((rainRate[i]) >= 6.0) {
            cout << "Rainfall rate is High" << endl;
        } else if (rainRate[i] < 6.0 && rainRate[i] > 3.0) {
            cout << "Rainfall rate is Medium" << endl;
        } else if (rainRate[i] <= 3.0) {
            cout << "Rainfall rate is Low" << endl;
        }

        averageRainfall += rainRate[i];
    }

    cout << "The average rainfall rate for this week is:  " << endl;
    cout << (averageRainfall / (double) 7);

    return 0;
}

当将数组的大小更改为7并将值分配给6个索引时,这将无问题地运行,但如果使用数组的确切大小,则会导致分段错误。

2 个答案:

答案 0 :(得分:2)

由于double rainRate[6];的大小为6,但您的代码尝试访问7个项目:[0][1][2][3],{{ 1}},[4][5]

如果您有一个[6]元素数组,则有效索引为n - 0。在您的情况下n-1 - 0

解决方案:将5替换为i <= 6

答案 1 :(得分:1)

使用数组的确切大小。 rainRate有6个元素,索引为0,1,2,3,4和5.

使用i < 6而不是i <= 6进行修复,或者将数组的大小增加1。

最后,考虑使用size_t作为数组索引类型。使用unsigned 可以让你在将来遇到麻烦,因为它的最大大小可能小到65535,并且数组现在可以包含比这个数量更多的元素。有些人提倡使用ptrdiff_t(因为这会支持负面索引),但我是使用size_t的。