次の構造体があります
struct teststruct
{
int *a;
void *data;
};
void ポインターを含む構造体のディープ コピーを行うことは可能ですか? data
ポインタが指しているバイト数がわからないと思いますか?したがって、指定されたバイト数をmallocしてmemcpyを実行することはできません。私は正しいですか?
次の構造体があります
struct teststruct
{
int *a;
void *data;
};
void ポインターを含む構造体のディープ コピーを行うことは可能ですか? data
ポインタが指しているバイト数がわからないと思いますか?したがって、指定されたバイト数をmallocしてmemcpyを実行することはできません。私は正しいですか?
いいえ。void* が指す型がわからないため、ディープ コピーは問題外です。
さらに、それらの単一または配列のa
いずれかを指す可能性があるため、ディープコピーさえできませんでした。int
通常、C では、ディープ コピーを実行できるようにする場合、その内容のデータ型を保持する構造体を使用します。例えば:
struct teststruct {
int a_sz;
enum voidType vt;
int *a;
void *data;
};
a_sz
次に、 が指すメモリが構成されている整数のa
数と の列挙型を把握するために使用できますがdata
、技術的には配列にすることもできるため、 も必要になる場合がありd_sz
ます。
別のトリックはdata
、次のように、独自のデータ型が埋め込まれた構造体を指すようにすることです。
typedef struct {
enum voidType vt;
union {
int i;
float f;
double d;
}
} tVoidType;
が指すデータのサイズに関する情報がない場合は、void *data
この構造体を正常にディープ コピーできないと言えます。
あなたは正しいです。何バイトが に割り当てられているかわかりませんdata
。実際、それがed メモリをdata
指していることさえ確信できません。malloc()
ヒープ、スタック、またはグローバル空間上の任意のものを指している可能性があります。
データのサイズがわかったとしても、内部データの構造がわからないということは、適切な「ディープ コピー」ができないことを意味します。ディープ コピーは、最初のポインターの深さでは停止しません。
あなたは正しいですが、区別してください。ディープコピーを作成できますが、ポインターが指すバイト数を知ることはできません。