1

这将是两个问题

我有两段代码,唯一的区别是 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

案例二:

#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”指针确实产生段错误时引用它时不会产生段错误。它们具有相同的声明和相同的用法,为什么不同?

谢谢!

4

1 回答 1

6

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

于 2012-12-29T07:20:29.797 回答