4

だから私は次のものを持っています:

int from[2][3] = { {1,2,3}, {2,3,4} };
int into[3];

into = memcpy(into, from[0], 3 * sizeof(*into));

「from」を配列「into」にコピーして、「into」= { 1, 2, 3} にしたい

memcpy を使用して上記のことを実行しようとしています (すでにループで動作していることはわかっています) が、うまく動作しないようです。

エラーが発生し続けます:

error: incompatible types when assigning to type ‘int[3]’ from type ‘void *’

この質問へのリンクを見つけました:

1 次元配列を別の 2 次元配列の一部に、またはその逆にコピーするにはどうすればよいですか?

私のコード(上記)を変更しましたが、それでもエラーが発生します。

私はまだ無知です。私は別の方法で問題を解決しましたが、以前の投稿からそれが可能であることを知っているので、好奇心でそれがどのように行われるか知りたいです。

4

2 に答える 2

3

KingsIndian が指摘しているように、このインスタンスでは戻り値が実際には必要ないため、割り当てを削除することで問題を回避できます。ただし、内部で何が起こっているかを理解することは、将来的に役立つ場合があります。

memcpy は、その宛先へのポインターを返します。「into」がポインタである場合は、問題ありません。

int from[2][3] = { {1,2,3}, {2,3,4} };
int into[3];
int *into_ptr = into;

into_ptr = memcpy(into_ptr, from[0], 3 * sizeof(int)); // OK

問題は、「into」がポインターではなく配列であることです。C の配列は変数ではないため、代入できないため、エラーが発生します。配列とポインタは同等であるとよく言われますが、相違点があり、これが 1 つです。配列とポインターの違いの詳細については、次を参照してください。

http://eli.thegreenplace.net/2009/10/21/are-pointers-and-arrays-equivalent-in-c/

編集:

割り当てを行わずに問題を完全に回避するには、戻り値を無視します。

int from[2][3] = { {1,2,3}, {2,3,4} };
int into[3];

memcpy(&into[0], from[0], sizeof(into));
于 2013-05-27T21:04:47.653 に答える
2

memcpy は、配列に割り当てようとしている宛先へのポインターを返します。memcpy の戻り値は無視できます。

   #include <string.h>

   void *memcpy(void *dest, const void *src, size_t n);

おそらくあなたが望むのは:

memcpy(into, from[0], sizeof into);

これにより、それぞれ 4 バイトの 3 つの要素 (sizeof into == 12ここ) が からfrom[0]にコピーされintoます。

于 2013-05-27T20:14:10.693 に答える