在C ++中使用向量时出现分段错误?

时间:2017-05-15 13:30:29

标签: c++ vector segmentation-fault

为什么我在以下代码中遇到分段错误? 此代码以第一个元素为0的数组开始。然后是一个数组t,其元素是s的补码,然后是t,它被附加到s,直到size大于1000。 然后,用户输入查询的数量,并打印具有数组s的索引x的元素。

#include <bits/stdc++.h>

using namespace std;

int duplication(int x){
     // Complete this function
     vector <int> s;
     vector <int> t;
     int i=0,j;
     int n=0;
     s.push_back(n);
     while(true){
         t.clear();
         for(j=0;j<s.size();j++){
             int k = 1 - s.at(j);
             t.push_back(k);
         }
        for(j=0;j<s.size();j++){
             s.push_back(t[j]);
        }
        if(s.size()>1000) break;
    }
    i=s[x];
    return i;
}

int main() {
    int q;
    cin >> q;
    for(int a0 = 0; a0 < q; a0++){
        int x;
        cin >> x;
        int result = duplication(x);
        cout << result << endl;
    }
    return 0;
}

2 个答案:

答案 0 :(得分:0)

对于第二个循环,我认为它应该是

 for(j=0;j<t.size();j++)

另外,i = s [x]应该检查x是否包含s的索引范围。

答案 1 :(得分:0)

你的问题是第二个for循环。

for(j=0;j<s.size();j++){
    int k = 1 - s.at(j);
    t.push_back(k);
}

for(j=0;j<s.size();j++){ // First iteration size of S is 1, Size of T is 1
    s.push_back(t[j]);   // Size of s is now 2.
                         // Loop iteration comes around again j = 1 which is < 2
                         // t has a size of 1, you are accessing the 2nd index
                         // which is memory that you do not own.
}

s的大小将在每次迭代时被解析,因为它不断变化,你可以存储一个变量来跟踪s的大小或使用t的大小,但要小心,如果s的大小越来越大,那么并且你存储s的大小你会遇到同样的问题。

在此处阅读分段错误: What is a segmentation fault?