C:深いコピー - のvoidポインタと構造
-
19-09-2019 - |
質問
私は、次の構造体を持っている。
struct teststruct
{
int *a;
void *data;
};
これは、ボイドポインタを含む構造のディープコピーを行うことは可能ですか?私はへのポインタポイントをdata
どのように多くのバイトを伝えることができないと仮定しますか?だから私は、指定されたバイト数をmallocとのmemcpyを行うことはできません。私は右だ?
解決
はありません。あなたはタイプを知らないので、それにvoid *型のポイント、深いコピー問題外です。
また、あなたはそれがいずれかの単一a
は、それらの配列をotのためにも、深いコピー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
のために割り当てられているどのように多くのバイトを伝えることはできません。実際に、あなたもdata
ポイントがメモリをmalloc()
edしていることを確認することはできません。それは、ヒープ、スタック、またはグローバル空間上で何かを指すことができます。
は、を場合でもはデータのサイズを見つける、あなたはまだその適切な「ディープコピー」を意味し、の構造の内部データのを、考え知ることができませんでしたことはできません。深いコピーは、最初のポインタの深さで停止しないでしょう。
あなたは正しいですが、区別してください:あなたは深いコピーを作成することができますが、あなたはどのように多くのバイトポインタが指すに伝えることができません。
。