为什么会有分割错误?

时间:2019-03-14 06:36:27

标签: c++

嗨,我刚刚开始学习c ++并带有奇怪的行为。

这是代码

#include <iostream>
#include <vector>
#include <algorithm>

long long MaxPairwiseProduct(const std::vector<long long>& numbers) {
    int n = numbers.size();
    int fidx, sidx = 0;

    for (int i = 1; i < n; ++i) {
        if (numbers[i] > numbers[sidx]) {
            fidx = sidx;
            sidx = i;
        } else if (numbers[i] > numbers[fidx]) {
            fidx = i;
        }
    }
    return numbers[fidx] * numbers[sidx];
}

int main() {
    int n;
    std::cin >> n;
    std::vector<long long> numbers(n);
    for (int i = 0; i < n; ++i) {
        std::cin >> numbers[i];
    }

    std::cout << MaxPairwiseProduct(numbers) << "\n";
    return 0;
}

我用 g++ -pipe -O2 -std=c++11 max_pairwise_product.cpp 然后输入以下内容:

2
100000 90000

并抛出Segmentation fault (core dumped) 但是当我在计算maxPairwiseProduc的结果之前添加std::cout << sidx << fidx << std::endl;时,它会编译并按预期工作,从而提供正确的结果。 实际上,即使我只放std::cout << ""; 那么这里发生了什么?以及如何调试此类情况以了解发生了什么?

1 个答案:

答案 0 :(得分:2)

int fidx, sidx = 0;

fidx尚未初始化,会导致未定义的行为,因此它有时可能需要工作,有时则可能不需要

int fidx = 0;
int sidx = 0;

这是一篇使用c ++ link

初始化变量的方法不同的文章