2012-03-17 6 views
0

私はC++が新しく、ポインタを使って値を返すことを実験しています。私はシンプルなプログラムを書きましたが、なぜクラッシュするのか理解できません。あなたはそれがランダムメモリで指すように、main()pMyBoolを初期化し、しませんポインタを使用して値を返す - プログラムがクラッシュする

main.cppに

int main() { 
    bool *pMyBool; 

    bar myBar; 
    myBar.foo(pMyBool); 

    cout << *pMyBool << endl; 

    return 0; 
} 

bar.cpp

int bar::foo(bool *pMyBool) { 
    bool myBool = true; 
    *pMyBool = myBool; 
    return 0; 
} 

出力

1 
//then it crashes 

答えて

3

、あなたがあなたのケース内のポインタを使用する必要はありませんが、参照使用する:もちろん

int bar::foo(bool &MyBool) { 
    MyBool = true; 
    return 0; 
} 

を、あなたは自分のmain

bool MyMainBool = false; 
    bar.foo(MyMainBool); 
4

ランダムなメモリが有効なメモリではないため、プログラムがクラッシュします。

一つの可能​​な修正:ポインタを

int main() { 
    bool value; 
    bool *pMyBool = &value; 

    bar myBar; 
    myBar.foo(pMyBool); 

    cout << *pMyBool << endl; 

    return 0; 
} 

、あなたは常にあなたがそれらを使用してみてください前に、彼らはどこかにポイントするように初期化することを確認する必要があります。 いつも!

2

pMyBoolは有効な場所を指していません。だからあなたはそれを逆参照することはできません。
まず、メモリを割り当てて、ポインタをポイントしてポインタを指すようにしてください。 bool *pMyBool = new bool;
以降のメモリを解放します。 delete pMyBool;

-1

myBoolが "スタック"(ローカル変数)に割り当てられているためです。関数fooが終了すると、fooに関連付けられたスタックが解放されるため、ポインタpMyBoolはもはや有効ではないメモリアドレスを指しています。

C++で
+0

から呼ぶことにしますもう一度見て、実際には、これはプログラムがクラッシュする理由が間違っています。 –

+0

これは問題ではありません。パラメータによって指される変数に(aのコピー)ローカル値を割り当てていますが、パラメータがどこか有効であるように初期化されていません。 –

関連する問題