1

この非常に役立つ Q/A を見つけた後:配列のすべてのメンバーを同じ値に初期化する方法は? の配列間でデータを交換する方法に関する私の絶え間ない問​​題に相当するものがあるかどうか疑問に思いましたC

これらは、私が最も興味を持っているいくつかのケースです。

  1. 同じ型から同じ型、同じサイズ (例: char から char)
  2. ある型から別の型へ、同じサイズで (例: const char から unit8 へ)
  3. 小さいものから大きいものへ (例: test[7] から test[70])

上記のものに対する私の方法は次のようになります-例:

  1. array1 = array2
  2. memcpy(&array2,array1,sizeof(array1))
  3. Eightermemcpyも、または要素を介して for ループ

ここの誰かが、さまざまな配列交換ルーチンの精巧に抽出された例のコレクションを提供するか、どこで見つけられるかを知っていることを願っています。それは、私が自分でそれを機能させることができないということではなく、解決策がしっかりしている場合、この絶え間ない不安があるということです.

ああ、私はそれらの for ループが本当に嫌いで、各要素を個別に割り当てます。私にとって、それらを使用する唯一の理由は、交換が実行される前に追加の処理が必要な場合です。たとえば、最初に転送された値をインクリメントするなどです。

これが Q/A-Style に合わない場合は、誰かが私の試みを確認または改善してくれれば幸いです。

#define SIZEOF_ARRAY = 16;

uint8 array2[SIZEOF_ARRAY+1];
const char array1[SIZEOF_ARRAY+1] = {"test"};

memcpy(&array2,array1,sizeof(array1))
4

1 に答える 1

4

まず、ケース 1 は意味がありませんconst。配列にコピーすることはできません。それは一定です。

次に、2番目のケースのコードを使用した2つのちょっとしたこと:

  1. そのような場合、配列名は最初の要素へのポインターに減衰するため、&は必要ありません。
  2. sizeofは関数ではないため、括弧は必要ありません。

したがって:

memcpy(array2, array1, sizeof array2);

これを行うのは少し危険であることに注意してください。サイズが実際に一致していることを確認する必要があります。

于 2012-11-22T14:57:40.003 に答える