0
#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[] 和 a[] 的地址匹配,但值仍然不匹配。

在 linux 上,有时会显示“BUS ERROR”,有时会显示“Segmentation fault”。

如果有人解释“BUS ERROR”是什么意思会更好?为什么它会出现在这个程序中。 linux 海合会

4

4 回答 4

6

您的数组r中只有一个元素的空间,但您存储 4。这会覆盖内存,导致崩溃。

改变这个:

int *r[]={NULL};

至:

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

这使得r具有与 相同数量的元素a,即 4。

于 2013-09-09T07:50:02.167 回答
3

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

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

BUS ERROR:什么是总线错误?

于 2013-09-09T07:52:16.107 回答
3

您没有为r. 尝试一下int *r[4];,您将不会遇到分段错误。

int *r[] = {0}它相当于int *r[1];

于 2013-09-09T07:54:30.273 回答
0

r 是一个指针数组,但在您的代码中,它只有一个元素。你很幸运能在 Windows 上运行它,但这是一种未定义的行为。它今天在你的编译器上似乎可以工作,但它不是合法的 C 或 C++,并且不能保证下次运行程序时它仍然可以工作。或者它甚至现在还没有覆盖基本数据,而您只是还没有遇到将要引起的问题。

于 2013-09-09T07:55:21.137 回答