これは1つに2つの質問になります
私には2つのコードがありますが、唯一の違いはint*aの宣言の順序です。およびintcpt= 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変数はどこでも使用されていないのに、なぜその宣言がエラーに影響するのでしょうか。
また、2番目の場合のポインター「a」が「b」ポインターがセグメンテーション違反を生成するのに、それを参照するときにセグメンテーション違反を生成しないのはなぜか疑問に思います。それらは同じ宣言と同じ使用法を持っています、なぜ違いがありますか?
ありがとう!