来自couts的奇怪的分段错误

时间:2018-12-10 01:23:15

标签: c++ segmentation-fault

所以我有这段代码..它似乎没有韵律或原因就发出了分段错误。我这样做是为了解决HackerRank的练习问题,当我离开所有的球杆时,它可以正常工作,但是我失败了,因为所有额外的输出。

当我注释掉/直接删除提示行时,我会遇到细分错误。

ive以脚本形式编写了代码,并且主fxn调用了单独的fxn以输出正确的数字,并且仍然相同。但是我知道逻辑是合理的,因为它在底部输出正确的答案。

测试的结果是,它输入3行:第一行为5,第二行为10 40 30 50 20,第三行为1 2 3 4 5。第一行指定接下来的2个数组的长度,并用第二和第三行的值填充。输出应该是只有一行包含32.0的值,但我似乎只能使它与注释一起使用,从而将输出至少更改为21行

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int n;
double wm=0;
vector<double>a1(n);
vector<double>a2(n);

double result(vector<double> arr1, vector<double> arr2){
    double wv=0.0;
    double wv2=0.0;
    for(int i=0; i<n; i++){
        wv+=(arr1[i] * arr2[i]);
        cout<<wv<<"\n";
    }
    for(int i=0; i<n; i++){
        wv2+=arr2[i];
        cout<<wv2<<"\n";
    }
    return wv/wv2;

}
int main() {
    /* Enter your code here. Read input from STDIN. Print output to STDOUT */  
    cin>>n;

    for(int i=0; i<n; i++){
        cin>>a1[i];
        cout<<a1[i]<<"\n";
    } 
    for(int ii=0; ii<n; ii++){
        cin>>a2[ii];
        cout<<a1[i]<<"\n";
    }
    wm=result(a1,a2);
    cout.precision(1);
    cout<<fixed<<wm;
    return 0;
}

**********************这是Main()调用Result(),这是脚本格式**********

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int main() {
    /* Enter your code here. Read input from STDIN. Print output to STDOUT */  
    int n;
    vector<double>a1(n);
    vector<double>a2(n);
    double wv=0.0;
    double wv2=0.0;
    double wm=0;
    cin>>n;

    for(int i=0; i<n; i++){
        cin>>a1[i];
        cout<<a1[i]<<"\n";
    } 
    for(int ii=0; ii<n; ii++){
        cin>>a2[ii];
        cout<<a2[ii]<<"\n";
    }
    for(int i=0; i<n; i++){
        wv+=a1[i] * a2[i];
        cout<<wv<<"\n";
    }
    for(int i=0; i<n; i++){
        wv2+=a2[i];
        cout<<wv2<<"\n";
    }
    wm=wv/wv2;
    cout.precision(1);
    cout<<fixed<<wm;
    return 0;
}

1 个答案:

答案 0 :(得分:1)

在这两个代码中,您都将a1a2初始化为大小n,在第一个代码示例中该点为零,在第二个示例中不确定(因为未初始化)。您永远不会调整这些向量的大小,而是稍后再尝试对它们进行索引,就好像从n读取cin之后它们的大小一样。

这是未定义的行为,它是否会“起作用”纯粹是运气。在第二个示例中,具有不确定大小的初始化也是未定义的行为。

还请注意,全局变量的初始化顺序比较棘手,并且只能在这种情况下正常工作,因为矢量是在动态初始化阶段初始化的,而n是在静态初始化阶段,该阶段总是在动态阶段之前进行排序。通常,通常无法保证全局初始化将按预期顺序进行。

如果启用了额外的警告和可能的优化,则某些编译器会警告您有关第二个代码中未初始化变量的使用。 (例如,对于clang -Wall -Wextra,对于gcc -Wall -Wextra -O2

此外,using namespace std;是一种不好的做法,请参见this question