2017-09-12 15 views
1

これは私が持っているものです。ポインタの問題への参照?

void g(int *&x) { 
    int a = 3; 
    x = &a; 
} 
void h(const int *&x) { 
    int b = 2; 
    x = &b; 
} 
int main() { 
    int *p = new int; 
    *p = 5; 
    g(p); 
    cout << p << " " << *p << endl; // Print #2 
    cout << p << " " << *p << endl; // Print #3 
    const int*p1 = p; 
    h(p1); 
    cout << p << " " << *p << endl; // Print #4 
    cout << p << " " << *p << endl; // Print #5 
} 
私が理解から

Print#2Print#3は同じ結果を持っている必要がありますが、私はそれをコンパイルするときにそうではありません。それはPrint#4Print#5にもなります。誰か助けてくれますか?
更新:これは、出力は私が自分のコンピュータ上でそれをコンパイルするときのように見えるです:

00EFF9D4 3 //1 
00EFF9D4 1552276352 //2 
00EFF9D4 2 //3 
00EFF9D4 1552276352 //4 

べきではない(1)及び(2)は同じになりますか? (3)および(4)のいずれかである。

+2

関数 'g'では、' a'とは何ですか?私たちを表示するには、[最小、完全で、検証可能な例](http://stackoverflow.com/help/mcve)を作成してください。また、期待された出力と実際の出力を示してください。 –

+5

関数 'h'に関しては、ポインタが範囲外になるローカル変数を指し示すようにし、関数が返ったらそれを止めます。そのポインタを間接的に参照すると、プログラム全体が不正になり*無効になる[*未定義の動作*](http://en.cppreference.com/w/cpp/language/ub)が発生します。 –

+0

おそらくtypoはint aであることを意図していました。 – Ron

答えて

3

int ag()とします。

あなたの関数がに、関数の終了後に、スコープのうちを移動しますローカル変数を、ポインタのポイントを作ります。

次に、未定義動作を呼び出すポインタを逆参照します。

+0

_Undefined Behavior_が2番目の_cout_で呼び出された理由は、最初の_cout_では発生していませんでした。 –

+0

@DangNguyen ...未定義の行動...正確に何が起こるかわからない! ;) – gsamaras

関連する問題