3

次の構造体があります

struct teststruct
{
int *a;
void *data;      
};

void ポインターを含む構造体のディープ コピーを行うことは可能ですか? dataポインタが指しているバイト数がわからないと思いますか?したがって、指定されたバイト数をmallocしてmemcpyを実行することはできません。私は正しいですか?

4

4 に答える 4

8

いいえ。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;
于 2009-11-13T10:13:55.527 に答える
5

が指すデータのサイズに関する情報がない場合は、void *dataこの構造体を正常にディープ コピーできないと言えます。

于 2009-11-13T10:09:13.827 に答える
5

あなたは正しいです。何バイトが に割り当てられているかわかりませんdata。実際、それがed メモリをdata指していることさえ確信できません。malloc()ヒープ、スタック、またはグローバル空間上の任意のものを指している可能性があります。

データのサイズがわかったとしても、内部データの構造がわからないということは、適切な「ディープ コピー」ができないことを意味しますディープ コピーは、最初のポインターの深さでは停止しません。

于 2009-11-13T10:09:34.903 に答える
0

あなたは正しいですが、区別してください。ディープコピーを作成できますが、ポインターが指すバイト数を知ることはできません。

于 2009-11-13T10:15:25.720 に答える