首页 文章

来自couts的怪异分段错误

提问于
浏览
-1

所以我有这段代码..它似乎没有押韵或理由而出现分段错误 . 我正在为HackerRank练习问题,当我离开所有的couts,它工作正常,但我失败,因为所有额外的输出 .

当我注释掉/彻底删除cout行时,我会得到分段错误 .

香港专业教育学院以脚本形式编写代码,主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;
}

*********那是主要的()调用结果(),这是脚本格式

#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 回答

  • 1

    在这两个代码中,您正在初始化 a1a2 ,大小为 n ,在第一个代码示例中为零点,在第二个示例中为不确定(因为未初始化) . 你永远不会调整这些向量的大小,但是在 ncin 读取之后,尝试将它们编入索引,好像它们的大小更大 .

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

    还要注意全局变量的初始化顺序很棘手,它只能在这种情况下正常工作,因为向量在动态初始化阶段初始化,而 n 在静态初始化阶段初始化,静态初始化阶段始终在动态初始化阶段之前排序 . 通常,通常无法保证全局初始化将按预期顺序发生 .

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

    此外 using namespace std; 是不好的做法,见this question .

相关问题