ユニオンを持つ構造体へのポインタがあります
だから私たちが持っているとしましょう
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は、ユニオン内のものをコピーするのに十分です。
ポインタが有効なものを指していない場合は、ポインタを単に逆参照することはできません。
これを行うには、有効なメモリを指してx->u
いることを確認する必要がありx
ます。表示するコードは、初期化されていないポインタを逆参照します。これにより、未定義動作が発生し、クラッシュが発生する可能性があります。同じことが。にも当てはまりますy->u
。したがって、それらを逆参照する前に、有効なメモリを確認x
してポイントしてください。y
x->u = y->u
ディープコピーではなく、シャローコピーを実行します。
基本的に、同じメモリを指す2つのポインタが作成されますが、これはおそらく意図または必要なものではありません。
ディープコピーが必要な場合は、コピー先のデータを保持するのに十分なメモリをデスティネーションに割り当ててからmemcpy
、ソースユニオンの内容をデスティネーションにコピーするために使用する必要があります。
良い読み物:
深いコピーと浅いコピーの違いは何ですか?