我有一个数组b [i],它存储另一个数组a [i]的某些索引;两者都是整数数组 是否可以访问它 一个并[b [I]]
#include <iostream>
using namespace std;
int main()
{
int k=0,v=0,i,b[10],c[10];
int a[]={1,2,3,4,5,6,7,8,9,10};
for(i=0;i<10;i++){
if(a[i]%2==0)
{b[k]=i; k++;}
}
for(i=0;i<10;i++)
{
c[v]=a[b[i]];
v++;
}
return 0;
}
导致分段错误
答案 0 :(得分:1)
在你的第二个循环中,b数组只有一半初始化(每个偶数从1到10一次)所以当你尝试取消引用b [5]时你会得到未定义的行为,因此会出现段错误
答案 1 :(得分:0)
它可以正常工作,直到第二次循环达到i = 5。当i = 5时,a [b [5]]未定义,因为b [5]未初始化。在第一个循环之后,你有b [] = {1,3,5,7,9,......},其余部分未初始化。尝试初始化b [10],它应该可以工作。
b[10] = {};
答案 2 :(得分:0)
此方法应该有效:
a[b[i]];
我并非100%确定它会起作用,因为编译器也可以在这里发挥作用。例如,它在TC ++中完美运行......
更好的方法是:
for(i=0;i<10;i++)
{
int temp=b[i];
c[v]=a[temp];
v++;
}
答案 3 :(得分:0)
以下是您看到错误的原因:
在这种情况下,“分段错误”意味着您使用的[]数组索引远远超出进程可用内存中的值(注意:不需要超出计算机的内存范围以获取此错误;另请注意,使用稍微的索引大于数组大小不导致{{1}当然,这样的索引值仍然是语义错误。
当你声明b []时,你不会初始化它(通常这是)。
你的第一个循环只初始化b []的选定元素:只有b []开头的元素,因为[]中有偶数(你使用条件:segmentation faults
)。
目前,您在a:2,4,6,8,10中有5个偶数。这足以初始化b [0] ... b [4]的元素。以b [5]开头的b []元素未被初始化,即包含可被认为是随机的数字或垃圾。您可以打印b [5] ... b [9]以查看它们在没有初始化的情况下包含的内容 - 它通常为0(使调试更加困难,因为[0]不会导致分段错误 - 但是[0]是可能不是你想要的c [])。
但是在你的程序的不同运行中b []以b [5]开头的元素可以是任何东西(然后它们中的任何一个可以产生分段错误,例如[-2000000000])。 />
这些偶然值代表a []的有效索引的可能性极低。
救济:更改您的SECOND循环,使其仅运行k次,而不是10次。无论如何,这可能是你的初衷:
a[i]%2==0
答案 4 :(得分:0)
#include <iostream>
using namespace std;
int main()
{
int k=0,v=0,i,b[10],c[10];
int a[]={1,2,3,4,5,6,7,8,9,10};
for(i=0;i<10;i++){
if(a[i]%2==0)
{b[k]=i; k++;}
}
for(i=0;i<5;i++)
{
c[v]=a[b[i]];
v++;
}
return 0;
}
运作良好