0

C++ のポインターに関する問題が発生します。コードは次のとおりです。

int * initArray() {
    int a [2];

    a[0] = 1;
    a[1] = 2;
    return a;
}


int main () {
    int * b = initArray();

    cout << b << "---" << *(b) << endl;
    cout << b + 1<< "---" << *(b + 1) << endl;
}

出力は

0021FC20---1
0021FC24---1431629120

値が間違っていることがわかります。

init配列コードをメイン関数に入れようとすると、正しく実行されます。

私のコードで何が間違っているか教えていただけますか?

4

4 に答える 4

8

initArray関数が戻った後に存在しなくなるローカル配列のアドレスを返しています。これは未定義の動作です。

関数が返された場合でも変数をa永続化するには、次のいずれかを実行できます。

  • として宣言しますstatic
  • グローバルにする
  • 動的に割り当てる
于 2012-04-30T10:14:42.147 に答える
3

あなたがやろうとしていることを達成するための解決策は次のとおりです。

int * initArray() {
    int* a = new int[2];

    a[0] = 1;
    a[1] = 2;
    return a;
}

メモリは手動で割り当てられるため、保持され、構築は有効です。ええ、あなたの場合、メモリは自動的に割り当てられ、関数の最後に削除され、未定義の動作が発生しました。

于 2012-04-30T10:19:08.247 に答える
1

a は initArray メソッドに対してローカルです。メソッドが戻ると、a は無効になるため、initArray によって返されるポインターは無効になります。

代わりにメイン メソッドで配列を割り当ててから、ポインタを initArray メソッドに渡す必要があります。

void initArray(int *a) {
    a[0] = 1;
    a[1] = 2;
}

int main () {
    int b[2];
    initArray(b);

    cout << b << "---" << *(b) << endl;
    cout << b + 1<< "---" << *(b + 1) << endl;
}
于 2012-04-30T10:16:09.730 に答える
0

あなたの配列int a[2]は、関数が存在するときに割り当てが解除されるローカル配列です。

于 2012-04-30T10:14:57.390 に答える