1

私はupclsfにclsf_ptrのmemcpyを実行しています

memcpy(&upclsf, &clsf_ptr, sizeof(struct classifier));

gdbを使用してデバッグしているときに、印刷&upclsfを実行したときにupclsfのメモリアドレスを確認しました。

(gdb) p &upclsf
$1 = (struct classifier **) 0xbffff184

upclsfを印刷したとき

(gdb) p upclsf
$2 = (struct classifier *) 0x2e312e31

これは私が理解できないここのアドレスです、ここでupclsfは構造分類子のインスタンスです

4

1 に答える 1

4

GDBは同意しません—upclsfではなくstruct classifier、ポインタです。2つの回答のタイプが異なることに注意してください。最初のもの(&upclsf)はstruct classifier **、、2番目のもの(upclsf)はstruct classifier *です。メモリレイアウトは次のとおりです。

addr 0xbffff184 / upclsf: pointer to 0x2e312e31

addr 0x2e312e31 / *upclsf: (structure data)

次のように変更しますmemcpy

memcpy(upclsf, &clsf_ptr, sizeof(struct classifier));

またはおそらく:

memcpy(upclsf, clsf_ptr, sizeof(struct classifier));

memcpyデータを破棄するだけで、タイプセーフではないことに注意してください。したがって、使用するときは、指定するタイプが正しいことを確認するために特に注意する必要があります。次の関数を定義することをお勧めします。

static inline void
classifier_copy(struct classifier *dest, struct classifier const *src)
{
    memcpy(dest, src, sizeof(*dest));
}

これにより、タイプエラーがキャッチされます。1回または2回以上コピーする構造に対して、これらの1つを作成します。

于 2011-02-16T11:47:45.123 に答える