这将是一个
中的两个问题我有两段代码,唯一的区别是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”指针确实产生了段错误。他们有相同的声明和相同的用法,为什么差异?
谢谢!
答案 0 :(得分:6)
关键是你正在做的事情(取消引用一个未初始化的指针)导致未定义的行为,所以你真的不能指望任何特别是发生,也不是对于程序的作用,是否存在合理/“符合标准”的解释。但是,可能的情况是,堆栈的设置方式是,在第二种情况下,a
偶然指向有效的内存位置,但这只是猜测。