为什么在以下代码中出现分段错误? 此代码以第一个元素为 0 的数组 s 开头。然后,一个数组 t,其元素是 s 的补充,然后将 t 附加到 s,直到大小大于 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;
}
对于第二个循环,我相信应该是
for(j=0;j<t.size();j++)
另外,i=s[x]
应该检查x
是否与s
的索引边界有关。
您的问题是第二个 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 的大小比 t 更大,并且您正在存储 s 的大小,您将遇到同样的问题。
在此处阅读分段错误: 什么是分段错误?