7

ユニオンを持つ構造体へのポインタがあります

だから私たちが持っているとしましょう

struct A {
  union {
    char **word;
    struct A *B
  } u;
};

タイプA*の変数xとyがあります

typedef A* A_t;
A_t x;
A_t y;

x-> u = y-> uは、ユニオン内のものをコピーするのに十分です。

4

1 に答える 1

5

ポインタが有効なものを指していない場合は、ポインタを単に逆参照することはできません。
これを行うには、有効なメモリを指してx->uいることを確認する必要がありxます。表示するコードは、初期化されていないポインタを逆参照します。これにより、未定義動作が発生し、クラッシュが発生する可能性があります。同じことが。にも当てはまりますy->u。したがって、それらを逆参照する前に、有効なメモリを確認xしてポイントしてください。y

x->u = y->u

ディープコピーではなく、シャローコピーを実行します。
基本的に、同じメモリを指す2つのポインタが作成されますが、これはおそらく意図または必要なものではありません。

ディープコピーが必要な場合は、コピー先のデータを保持するのに十分なメモリをデスティネーションに割り当ててからmemcpy、ソースユニオンの内容をデスティネーションにコピーするために使用する必要があります。

良い読み物:
深いコピーと浅いコピーの違いは何ですか?

于 2013-01-13T06:19:54.577 に答える