質問

私は、次の構造体を持っている。

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していることを確認することはできません。それは、ヒープ、スタック、またはグローバル空間上で何かを指すことができます。

は、を場合でもはデータのサイズを見つける、あなたはまだその適切な「ディープコピー」を意味し、の構造の内部データのを、考え知ることができませんでしたことはできません。深いコピーは、最初のポインタの深さで停止しないでしょう。

あなたは正しいですが、区別してください:あなたは深いコピーを作成することができますが、あなたはどのように多くのバイトポインタが指すに伝えることができません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top