2016-04-13 16 views
0

私は今月1ヶ月間cppを勉強しています。関数内の変数は関数スコープ外からはアクセスできません。しかし、これは、私は、以下の場合と同様の機能のメンバーへのグローバルポインタを使用する場合場合ではないようです。関数スコープ外の関数変数へのアクセス

#include <iostream> 

void fun(void); int *pInt; 

int main(int argc, char **argv) { 

    pInt = 0; 
    fun(); 
    std::cout << "*pInt = " << *pInt << std::endl; 
    return 0; 
} 

void fun(void) { 
    int a = 3; 
    pInt = &a; 
} 

は、コンパイル、これは任意のエラーを生成し、実際にプリントアウトしていない実行しています期待される結果。 なぜこれが起こっていますか?関数funが有効範囲外になった後、 "a"がスコープ(したがってその値)から抜け出すとは思われませんか?

+0

これは[ダングリングポインタ](https://en.wikipedia.org/wiki/Dangling_pointer)と呼ばれます。既にSOで答えられている[this](http://stackoverflow.com/questions/35877487/dangling-pointer-is-still-accessing-the-memory-value)のような質問を参照してください。 –

+1

コンパイラは、pIntが指すメモリの内容を意図的に破棄するコードを生成しません。範囲外になると、pIntが指し示すメモリに何が起こるかについて、すべての賭けはオフになります。おそらく、それは上書きされる他の操作のためにゴミに変わるかもしれませんが、おそらくそうではありません。しかし、このメモリにアクセスすると、あなたが期待することはないと常に仮定してください。 – Amnon

答えて

0

いいえ、あなたが見ているのはundefined behaviorです。

fun()関数の実行が終了すると、aは存在しなくなります。したがって、main()では、ポインタを参照解除する(先に)メモリ位置がaになると、UBが呼び出されます。

関連する問題