• ベストアンサー

正確に複製を作りたい

以下、変数のコピーで悩んでいます。 test()関数内で、正しく引数のコピーができるようにしたいのですが どうすればよいのでしょうか? int pa[50]; int pb[30][2]; int pc = 10; test(&pa, &pb, pc); void test(const int a[], const int b[][2], int c){ int aa[100]; int bb[20][2]; int cc; cc = c; // これはわかります。 aa = a; // ? 1 memcpy(aa, a, sizeof(a)); // ? 1 // aのサイズが50とわかっている場合 for (int i=0; i < 50; i++){ aa[i] = a[i]; } // bと同じ内容をbbに入れたい場合? }

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

正しく引数をコピーというのが何を期待しているのかによります。 void test(const int a[], const int b[][2], int c) というのは void test(const int *a, const int (*b)[2], int c) と同じ意味です。 すなわち、第1、第2引数はポインタ型ですから、ポインタの値をコピーすれば、正しく引数をコピーできたことになります。 void test(const int *a, const int (*b)[2], int c) {  const int *aa = a; /* コピーできた */  const int (*bb)[2] = bb; /* コピーできた */  int cc = c; /* コピーできた */  ... } ポインタの参照先は引数ではありませんので、コピーの必要はないはずです。 もし、配列の全要素をコピーしたいということであれば、(可変個引数を使うなどして)全要素を実引数として関数に渡さなければなりません。 本当は引数をコピーしたいのではなく、ポインタが参照する配列をコピーしたいのであれば、あらかじめ配列の要素数について呼び出し元と呼び出し先の双方で合意が取れているか、別途要素数を渡す必要があります。 あるいは、配列の先頭に要素数を入れたり、終端に番兵を入れることができるのであれば、それでもかまいません。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

それだけの情報だと, C では無理. C++ なら template を駆使すれば (というほどじゃないけど) 可能.

すると、全ての回答が全文表示されます。

関連するQ&A