是否可以访问数组数组中的元素?

时间:2016-05-14 02:31:45

标签: c++

我有一个数组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;
}

导致分段错误

5 个答案:

答案 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;
}

运作良好