Sam*_*Sam 1 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;
}
Run Code Online (Sandbox Code Playgroud)
输出:
begin
after init 0x7fff6c97f05e
Bus error: 10
Run Code Online (Sandbox Code Playgroud)
案例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;
}
Run Code Online (Sandbox Code Playgroud)
输出:
begin
after init 0x7fff50e4ac00
after assign
0x7fff50e4ac00 2
after cout
Segmentation fault: 11
Run Code Online (Sandbox Code Playgroud)
我想知道为什么声明顺序会影响错误.cpt变量在任何地方都没有使用,为什么它的声明会影响错误呢?
我还想知道为什么第二种情况下指针"a"在引用它时"b"指针确实产生段错误时不会产生段错误.他们有相同的声明和相同的用法,为什么区别?
谢谢!
小智 6
关键是你正在做什么(取消引用一个未初始化的指针)导致未定义的行为,所以你真的不能指望任何特定的事情发生,也没有一个合理的/"标准一致"解释程序的作用.然而,情况可能是,堆栈的设置方式在第二种情况下,a偶然指向有效的内存位置,但这只是猜测.