3

私は2つのコードを持っています:
通常:

int* p[5];
for (int i=0;i<5;i++){
    int s = rand()%25;
    p[i]=&s;
}

動的:

int* p[5];
for (int i=0;i<5;i++){
    int* s = new int;
    *s = rand()%25; //Edit: typo, I didn't want to make a random pointer
    p[i]=s;
}

ここで、配列pをp[i]最初に出力し、次に次のように出力*p[i]すると、次のようになります。

 static             dynamic
0x22ff04 7         0x22ff30 7
0x22ff04 7         0x22ff24 14
0x22ff04 7         0x22ffa6 2
0x22ff04 7         0x22ff89 8
0x22ff04 7         0x22ff13 21

では、動的宣言では複数のオブジェクトが作成されているのに、なぜpのすべての要素が通常の宣言で同じ場所を指しているのでしょうか。
どうしてこれなの?

4

3 に答える 3

6

最初のケースでは、すべてのエントリがポイントし、スコープ外にsなる瞬間にぶら下がったままになります。s間接参照p[i]は、未定義の動作につながります。

2番目のケースでは、各エントリは個別のヒープ割り当てオブジェクトを指します。ここでは、未定義の動作はありません(ただし、メモリリークがあります)。

于 2013-03-04T14:42:14.457 に答える
4

私はあなたがランダムな値の配列を望んでいたというこっそりの疑いを持っています:

#include <cstdlib>
#include <vector>
#include <algorithm>
#include <iterator>

int main()
{
    std::srand(time(0)); // Don't forget to seed!

    std::vector<int> v(5);
    std::generate(v.begin(), v.end(), random);

    // or
    std::vector<int> w;
    std::generate_n(std::back_inserter(w), 5, random);
}
于 2013-03-04T14:47:41.633 に答える
1

最初のケースでは、各反復でスタックに整数を割り当ててから、このアドレスを配列に割り当てます。スタックには他の変数がないため、スタックs上の同じアドレスに常に割り当てられp、最後のランダムな値、つまり7を含む同じアドレスを指すすべての要素になります。ループでは、スコープを離れた後s、コンパイラが同じアドレスを使用して他のデータを格納できるため、このアドレスに何を書き込むことができるかわかりません。ループの外側に移動することでこれを防ぐことができint sますが、それでもp同じスタックアドレスを指すすべての要素があります。

2番目のケースでは、各反復でヒープに新しい整数を割り当てるため、p5つの異なるオブジェクト/アドレスを指します

何を達成しようとしていますか?

于 2013-03-04T14:44:25.997 に答える