1

これは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」ポインターがセグメンテーション違反を生成するのに、それを参照するときにセグメンテーション違反を生成しないのはなぜか疑問に思います。それらは同じ宣言と同じ使用法を持っています、なぜ違いがありますか?

ありがとう!

4

1 に答える 1

6

重要なのは、実行していること(初期化されていないポインターを逆参照すること)によって未定義の動作が発生することです。そのため、特に何かが発生することは期待できません。また、プログラムの動作についての合理的/「標準準拠」の説明もありません。ただし、2番目のケースでは、a誤って有効なメモリ位置を指すようにスタックが設定されている場合がありますが、これは単なる推測です。

于 2012-12-29T07:20:29.797 に答える