文件末尾的分段错误

时间:2016-11-04 14:25:39

标签: c++ segmentation-fault

我的文件末尾出现以下错误:

Program received signal SIGSEGV, Segmentation fault.
At X:\Sorted\Coding\C++\Weighted Grade Calculator\Source.cpp:55

我不明白为什么会这样,因为有问题的行只包含}。看看:

#include<iostream>

using namespace std;

int main(){
    int numberweights;
    int current = 1;
    bool verbose = true;

    float grades[] = {}, weights[] = {};


    cout << "How many weights are there?";
    cin >> numberweights;

    /*-----------------------------------------------------*/

    for(int i = numberweights; i > 0; i--) {
        cout << "What is the weight for weight #" << current << "?";
        cin >> weights[current - 1];

        current++;

        if(verbose) {
            cout << "\n";
            cout << "I:" << i << "  " << "current:" << current << endl;
        }
    }
    current--;
    int rep = 0;

    cout << weights[0];
    cout << weights[1];
    return 1;
}

通常,i会随机跳转到超过10亿的数字。为什么会这样?

2 个答案:

答案 0 :(得分:1)

  1. 良好的格式是你的朋友。
  2. 你不打开/关闭文件,所以你的问题有点误导。
  3. weights [current - 1]是未定义的行为,因为数组的大小为0.
  4. 将数组更改为std :: vector,然后执行调整大小以使其达到所需大小。 由于您正在写入尚未按照定义方式分配的内存,因此当您尝试写入阵列时,我可能正在跳转,因为您正在写入它。一旦你写了一个足够大的工作阵列(或矢量),你的&#39; i&#39;应该按预期行事

    欢迎使用未定义的行为。

答案 1 :(得分:0)

您的计划格式不正确,因为:

float grades[] = {}, weights[] = {};

gradesweights是零长度数组。

g ++报告这是一个错误,为什么clang,错误地使它成为一个警告(因为他们将它与灵活的成员数组混淆,这是C ++的扩展,取自C99)。