4

重複の可能性:
ローカル変数へのポインタ
ローカル変数のメモリにそのスコープ外でアクセスできますか?

興味深い問題があります。ポインターを返す読み取り関数があります。

char * myReadFunc() {   
    char r [10];
    //some code that reads data into r.
    return r;
}

ここで、この関数を呼び出して、私が持っているいくつかの変数に情報を割り当てます。

char * s;
//Some code to specify where to read from.
s = myReadFunc();

これにより、意図したとおりの結果が得られます。

ただし、これを行うと:

char * s1;
char * s2;
//Some code to specify where to read from.
s1 = myReadFunc();
//Some code to change the read location.
s2 = myReadFunc();

奇妙な結果が得られます。データは両方とも同じで、常に 2 番目に指定された読み取り場所からのものです。

だから私はいくつかの代替コードを試しました:

char * s1;
char * s2;
//Some code to specify where to read from.
char r [10];
//some code that reads data into r. IDENTICAL to myReadFunc().
s1 = r;
//Some code to change the read location.
s2 = myReadFunc();

このコードは、意図したとおりの結果を生成します (s1ある場所からのデータがありs2、別の場所からのデータがあります)。

では、私の質問は、なぜ後者のコードが機能したのに、その上のコードが機能しなかったのかということです。私の推測では、どういうわけか私の関数は両方の変数にエイリアスされていて、両方を指していたので、呼び出されるたびに両方を再割り当てしたと思います。この動作の完全な理由を理解している人はいますか?

4

2 に答える 2

8

readFunc関数が期待どおりに機能しませ

関数の本体のスコープ内にのみある配列へのポインターを返しています。関数が終了すると、配列はスコープ外になり、後でそのメモリにアクセスしようとすると、未定義の動作が発生します。特定の状況下では動作するように見えるかもしれませんが、正しくありません。

代わりに、またはreadFuncを使用して配列をヒープに割り当てます。newmalloc

// it is the responsibility of the caller to delete[] the
//    returned buffer, but prefer to use e.g. shared_ptr
char *myReadFunc()
{
    char *r = new char[BUFFER_SIZE];
    //some code that reads data into r.
    return r;
}
于 2012-08-03T16:14:08.307 に答える
2

有効期間が終了した配列が指すメモリにアクセスしようとしているため、実行しようとしている動作に対して定義された動作はありません。

于 2012-08-03T16:14:37.067 に答える