C ++中的指针数组以及" BUS ERROR"

时间:2013-09-09 07:47:08

标签: c++ arrays pointers

#include<cstdio>
#include<string>
#include<iostream>

using namespace std; 

int main()
{
        int a[]={0,1,2,3};
        int *r[]={NULL};

        for(int i=0;i<4;i++)
        {
                r[i]=&a[i];
                cout << &a[i] << endl;
                cout << a[i]<<endl;
        }

        for(int i=0;i<4;i++)
        {
                cout << r[i] << endl;
                cout << *r[i] << endl;
        }
        return 0;
}

我最近开始研究指针数组。有人可以帮助我找出上述程序中的错误..

在Windows和Linux平台上运行时,我附上了结果的屏幕截图。

  

在Windows上,* r []和[]的地址匹配,但值仍然不匹配。

     

在linux上,它有时会说“BUS ERROR”,有时会说“Segmentation fault”。

如果有人解释“BUS ERROR”的含义会更好吗?为什么要这个计划。 linux GCC

4 个答案:

答案 0 :(得分:7)

你的数组r只有一个单独元素的空间,但你存储了4.那会覆盖内存,导致崩溃。

改变这个:

int *r[]={NULL};

为:

int *r[sizeof a / sizeof *a];

这使得ra具有相同数量的元素,换句话说就是4。

答案 1 :(得分:3)

int *r[]={NULL};应为int *r[]={0, 0, 0, 0};

这将为以下代码需要的四个指针分配空间。

BUS错误:What is a bus error?

答案 2 :(得分:3)

您没有为r分配足够的空间。试试int *r[4];,您就不会遇到分段错误。

int *r[] = {0}它等同于int *r[1];

答案 3 :(得分:0)

r是一个指针数组,但在您的代码中,它只有一个元素。你很幸运在Windows上运行它,但它是一个未定义的行为。它现在似乎可以在您的编译器上运行,但它不是合法的C或C ++,并且无法保证它在下次运行程序时仍然可用。或者它现在还没有覆盖基本数据,而你还没有遇到会导致的问题。