0

質問を解決するのに役立つ答えを探してみましたが、自分で解決することはできませんでした。それで、ここに行きます。Cに似たnesCでプログラミングしています。

構造体配列の特定の場所に構造体 v のディープコピーを作成しようとしています。構造体 v は次のように定義されます。

struct ip_iovec v = {
  .iov_next = NULL,
  .iov_base = payload,
  .iov_len  = len,
};

ここで、ip_iovec は次のように定義されます。

struct ip_iovec {
uint8_t         *iov_base;
size_t           iov_len;
struct ip_iovec *iov_next;
};

このために、同じ型の構造体配列を作成しました。

struct ip_iovec buffer_v[2]; 

ここで、v を buffer_v 配列の 2 番目の位置にディープコピーしたいと思います。このために私はやろうとしました

buffer_v[1] = v;
buffer_v[1].iov_next = v.iov_next;
buffer_v[1].iov_base = v.iov_base;
buffer_v[1].iov_len = v.iov_len;

そしてまた試した

memcpy(&buffer_v[0], &v, sizeof(struct ip_iovec));

しかし、これはどれもうまくいきませんでした。さらに、配列の位置 1 から位置 0 に値をコピーしたいと思います。

buffer_v[0] = buffer_v[1] (1)

位置 0 の構造体値を使用します。

value = &buffer_v[0] (2)

vを定義している関数は(1)(2)を実行した後に呼び出されるため、値が書き換えられてしまうので、deepcopyしたいと思います。上記の操作が機能しなかったと言うとき、v が変更されると、buffer_v[0] の値も変更されることを意味します。これは、正しいディープコピーを実行している場合には発生しないはずです。

助けてくれてありがとう!

4

1 に答える 1

0

「働いた」とはどういう意味ですか?これをどのように確認しますか?

構造をコピーするには、割り当てを使用するだけです。空想は必要ありません。

buffer_v[0] = v;

もちろん、vにポインターがあり、ポインター値をコピーしたくない場合、つまりコピー ポイントが同じデータにある場合は、新しいデータ用にスペースを割り当ててデータをコピーする必要があります。実際の宣言を表示しないため、struct ip_iovecそれを支援するのは困難です。

于 2013-10-31T12:15:32.520 に答える