• ベストアンサー

正確に複製を作りたい

以下、変数のコピーで悩んでいます。 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

  • 参照型の変数をポインタ引数を持つ関数に引数を書く方法

    C++の参照を使って以下のソースを試したのですが、 memmoveの引数のところでエラーが出ます。 memmoveの引数はポインタ型で合いません。 実体コピーしたい場合、どのようにすればよいのでしょうか? const AA &aとすれば、a自体が関数内で書き換わる心配がないので、 C++の参照型は、ポインタより安全と理解しているのですが その認識は間違っていないでしょうか? struct aa{ int x; int y; }AA; void test(AA &a) { AA b; memmove(b, a, sizeof(AA)); } void main(){ AA c; test(c); }

  • C言語の配列のコピーについて

    C言語の配列のコピーについて int a[] = {1,2,3}; int b[3]; memcpy(b, a, sizeof(a)); は、分かるのですが、 int c[][3] = { {1,2,3}, {4,5,6}, {7,8,9}, {10,11,12} }; int d[4][3]; memcpy(d, c, sizeof(c)); の使い方は正しいのでしょうか? 1次元配列の場合は連続するメモリ?なのでmemcpyでOKだと思うのですが 2次元以上の配列の場合は、メモリが連続しているか知らないので 不安に思いました。 実際、C言語でのメモリの取り方など詳しく書かれている本などありますか? よく初心者向け本にメモリは箱という大雑把なイメージで取り挙げられているのですが、突っ込んだ書籍等も探しています。 玄人の方、難しく(^^教えてください。

  • int型の変数値をバイト列としてコピー

    あるint型の変数に格納されている情報を、バイト列としてコピーする方法で困っています。 変数の入っている領域をそのままコピーしたいので、memcpyを使うかと思うですが、 コピーされた結果を見ると文字列の並びが逆転しているように見えます。 --サンプルコード抜粋 unsigned int i= 12345; unsigned char *c; c = (char *)malloc(sizeof(int)); printf("i_hex=%x\n",i); memcpy(c,(int *)&i,sizeof(int)); 出力結果 i_hex=3039 cの出力結果 3930000000 単純にmemcpyではダメなのでしょうか? 実行環境は、CentOS(32bit)+gccです。よろしくお願いします。

  • bashで配列の個数部分を変数で指定するとエラーに

    bashで配列の個数部分を変数で指定するとエラーになってしまいます。 #!/bin/bash aa[0]="a0" aa[1]="a1" aa[2]="a2" bb[0]="b0" bb[1]="b1" bb[2]="b2" bb[3]="b3" cc[0]="c0" cc[1]="c1" cc[2]="c2" cc[3]="c3" cc[4]="c4" list=(aa bb cc) for i in ${list[@]} do eval echo "$i=\${#$i[*]}" n="\${#$i[*]}" mes="\${$i[$(( ${RANDOM} * 3 / 32768 ))]}" eval echo "$mes \${$i[$(( ${RANDOM} * 3 / 32768 ))]}" done $ . list-test.sh aa=3 a1 a2 bb=4 b2 b2 cc=5 c0 c2 上記の下記箇所の「各配列の個数部分の3」をイメージ的には変数で指定したいです。 mes="\${$i[$(( ${RANDOM} * 3 / 32768 ))]}" ↓ mes="\${$i[$(( ${RANDOM} * $n / 32768 ))]}" $nのように指定すると、下記のエラーになってしまいます。 >bash: 29205 * ${#aa[*]} / 32768 : 構文エラー: オペランドが予期されます (エラーのあるトークンは "${#aa[*]} / 32768 ") ${n}や\$nや($n)など色々試してみたのですが、解決できませんでした。 恥ずかしながら、どなた様かご教授ねがえませんでしょうか

  • C言語の参照はずしについて

    ソートのプログラムなんですが #include <stdio.h> #include <stdlib.h> int comp(const void *, const void *); int main() { int i; int test[6] = {10, 8, 2, 6, 4, 0}; qsort(test, (size_t)6, sizeof(int), comp); printf("\n"); for (i = 0; i < 6; i++) printf("%d\n", test[i]); return 0; } int comp(const void *a, const void *b) { static int i = 1; printf("%02d--%d,%d\n", i, *(int *)a, *(int *)b); i++; return (*(int *)a - *(int *)b); } 最後のreturnの()の中身がよくわかりません。「参照はずし」という事をしてるらしいんですが「参照はずし」とは何ですか意味も教えてください。

  • C言語のsscanf関数の上手な使い方2

    質問NO.60489の追加です。 C言語で、 char buf[256] = "\"aa, aa\",100,\"bb bb\",200,\"cc-cc\"; char c1[10],c2[10],c3[10]; int i1,i2; のとき、 c1 = "aa, aa" c2 = "bb bb" c3 = "cc-cc" i1=100 i2=200 に読み込みたいのですが、 sscanf(buf,"\"%[^\"]\",%d,\"%[^\"]\",%d,\"%[^\"]\"",c1,i1,c2,i2,c3); では失敗します。 sscanfのformat部分をどのように書いたらよいか分かりません。

  •  ポインタを使って関数の値のやり取り

    c言語の問題なのですが、2つの異なる1次元配列の積をseki関数を使って計算してもうひとつの配列に入れてmain関数で表示するのですが、うまく走りません原因がわかる人がいた教えてください。 作った実行文は、 #include<stdio.h> int seki(int *pa,int *pb,int *pc); main(){ int a[]={5,2,3,5,3,2,4,8,9,9,7},b[]={4,3,8,4,6,2,8,9,1,6,4},c[11]={0}; int i,*pa,*pb,*pc; pa=&a; pb=&b; pc=&c; seki(pa,pb,pc); for(i=0;i<11;i++) printf("%d,",*(pc+i)); } int seki(int *pa,int *pb,int *pc){ int j; for(j=0;j<11;j++) *(pc+j)=*(pa+j) * *(pb+j); } こんな表示が出てきます。 toi2.c: In function `main': toi2.c:7: warning: assignment from incompatible pointer type toi2.c:8: warning: assignment from incompatible pointer type toi2.c:9: warning: assignment from incompatible pointer type たぶんmain関数内で書いたseki関数の引数の型に問題があると思うのですが。

  • 3つの連想配列を交互に代入して、新しい連想配列を作りたい

    PHP Version 5.1.6を使っています。 それぞれの連想配列を先頭から順番に交互に代入したいのですが、 どのようなプログラムでできるのでしょうか? $arr1 = array(a1=>"aa1", a2=>"aa2", a3=>"aa3"); $arr2 = array(b1=>"bb1", b2=>"bb2", b3=>"bb3"); $arr3 = array(c1=>"cc1", c2=>"cc2", c3=>"cc3"); 代入後 $new_arr = array(  a1=>"aa1",  b1=>"bb1",  c1=>"cc1",  a2=>"aa2",  b2=>"bb2",  c2=>"cc2",  a3=>"aa3",  b3=>"bb3",  c3=>"cc3", );

    • ベストアンサー
    • PHP
  • 二次元配列とポインタについてよくわかりません2

    先ほどもしつもんして自分なりに改良をくわえたのですが 上手くいきません。 int main( void ) {  int i, j;  /*4 x 4 行列 A*/  double a[4][4];  double *pa;  /*4 x 4 行列 B*/  double b[4];  double (*pb)[4];  /*4 x 4 行列 C*/  double c[4];  double (*pc)[4];  pa = a;  pb = b;  pc = c;  printf("4 x 4 行列 Aの要素を入力してください>\n");  for(i = 0; i < 4; i++){   for(j = 0; j < 4; j++){    printf("A[%d,%d]=", i + 1, j + 1 );    scanf("%lf", (*(pa + i) + j)); }} printf("4 x 4 行列 Bの要素を入力してください>\n"); for(i = 0; i < 4; i++){  for(j = 0; j < 4; j++){   printf("B[%d,%d]=", i + 1, j + 1 );   scanf("%lf", &pb[i][j]); }} としたところ(途中までを表記してます)  pa = a;  pb = b;  pc = c; のところでコンパイル時に 警告で問題のあるポインタの変換とでます なぜおかしいのかまったくわからないので よければ教えてください

  • ポインタの疑問点

    ポインタで分からないことがあります。 void swap(int* x, int* y){ int tmp; tmp = *x; *x = *y; *y = tmp; } /* int main(){ int *pA,*pB; *pA=5; *pB=10; cout << *pA << " , " << *pB <<"\n"; swap(pA,pB); cout << *pA << " , " << *pB <<"\n"; } */ int main(){ int a,b; a=5; b=10; cout << a << " , " << b <<"\n"; swap(&a,&b); cout << a << " , " << b <<"\n"; } 上のメイン関数ではエラーが起きます。どうしてなんでしょう? 下のと意味は同じだと思うのですが・・・