C ++指针声明命令输出分段故障或总线错误

时间:2012-12-29 07:17:43

标签: c++ pointers segmentation-fault bus-error

这将是一个

中的两个问题

我有两段代码,唯一的区别是int * a声明之间的顺序;和int cpt = 0;在第6和第7行。

案例1:

#include <iostream>
using namespace std;
int main()
{
    cout<<"begin"<<endl;
    int* a;
    int cpt = 0;
    cout<<"after init "<<a<<endl;
    *a = 2;
    cout<<"after assign"<<endl;
    cout<<a<<" "<<*a<<endl;
    cout<<"after cout"<<endl;
    int* b;
    *b = 2;
    cout<<b<<" "<<*b<<endl;
}

输出:

begin
after init 0x7fff6c97f05e
Bus error: 10

案例2:

#include <iostream>
using namespace std;
int main()
{
    cout<<"begin"<<endl;
    int cpt = 0;
    int* a;
    cout<<"after init "<<a<<endl;
    *a = 2;
    cout<<"after assign"<<endl;
    cout<<a<<" "<<*a<<endl;
    cout<<"after cout"<<endl;
    int* b;
    *b = 2;
    cout<<b<<" "<<*b<<endl;
}

输出:

begin
after init 0x7fff50e4ac00
after assign
0x7fff50e4ac00 2
after cout
Segmentation fault: 11

我想知道为什么声明顺序会影响错误。 cpt变量在任何地方都没有使用,为什么它的声明会影响错误呢?

我也想知道为什么第二种情况下指针“a”在引用它时不会产生段错误,而“b”指针确实产生了段错误。他们有相同的声明和相同的用法,为什么差异?

谢谢!

1 个答案:

答案 0 :(得分:6)

关键是你正在做的事情(取消引用一个未初始化的指针)导致未定义的行为,所以你真的不能指望任何特别是发生,也不是对于程序的作用,是否存在合理/“符合标准”的解释。但是,可能的情况是,堆栈的设置方式是,在第二种情况下,a偶然指向有效的内存位置,但这只是猜测。