0

ポインターへの2つの構造体ポインターがあります

typedef struct Square {
...
...
}Square;

Square **s1; //Representing 2D array of say, 100*100
Square **s2; //Representing 2D array of say, 200*200

どちらも を使用してヒープに割り当てられますmalloc()s1特定の値で初期s2化し、デフォルト値で完全に初期化しました。基本的に、 ( ) の値を維持しながらs1のサイズにサイズ変更する必要があり、「追加された」値はそのままの状態 (デフォルト値) になります。s2s1s2

私はこの質問memcpy() を小さい配列から大きい配列に書きましたが、どうやら配列とポインターを混同しているようです/

私の質問は、このサイズ変更をs1のサイズに実装する方法ですs2。元のポインターを保持する必要はありません。それがより良い方法であれば、コピーs1s2て返すことができs2ます。私が何を求めているのかを適切に説明したいと思います。ありがとう!

4

3 に答える 3

1

あなたはこのようなことを試すことができます:

typedef struct {
    //
} Square;

Square** s1; // 100x100, needs to resize and be like s2.
Square** s2; // 200x200

void resize_s1()
{
    // resize the outer array
    s1 = realloc(s1, sizeof(Square*)*200);
    memset(s1 + 100, 0, 100*sizeof(Square*)); // we initialize the newly allocated pointers to NULL

    for(int i = 0; i < 200; ++i)
    {
        // resize the inner array. Since we initialized the last
        // 100 pointers to null, realloc will just behave like
        // malloc for them.
        s1[i] = realloc(s1[i], 200*sizeof(Square));

        // ... and copy the new values in! You can omit this step,
        // but anything outside of the original bounds of s1 will
        // be uninitialized. All your pointers will be valid though.
        if(i >= 100)
            memcpy(s1[i] + 100, s2[i] + 100, 100*sizeof(Square));
    }
}

警告の言葉として-私はここでreallocを使って非常に速く緩く遊んでいます。詳細については、マニュアルページを参照してください。ただし、メモリ不足の状態に陥った場合は、悪いことが起こる可能性があります。

于 2012-08-02T23:37:44.160 に答える
1

2次元配列がメモリ内に順番に配置されます:row1row2row3など。

memcpyは、あるメモリ位置から別のメモリ位置に線形コピーを実行します。

したがって、必要なことを達成するには、次のようにします。

a)新しいアレイを作成します

Square **s3 = malloc(sizeof(s2));

b)s2をコピーします

c)s1から行ごとに新しいものにコピーします

for(r = 0; r < NROWS_S1; r++)
    memcpy(s3[r], s1[r], sizeof(Square) * NCOLS_S1);

http://www.fredosaurus.com/notes-cpp/arrayptr/23two-dim-array-memory-layout.html

于 2012-08-02T23:33:30.443 に答える