- ベストアンサー
配列を引数にする方法
以下の配列の引数の入れ方と受け方を教えて下さい int** p; /* malloc でp[4][2]を確保 */ test(p); <<=ここ --------------------------- void test(int p[][2]){ <<=ここ printf("%3d",p[0][0]); <<=ここ
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#include <stdio.h> #include <stdlib.h> void test(int **p){ int x,y; for(x=0;x<4;x++) for(y=0;y<2;y++) p[x][y]=y*4+x; } void main(void){ int **p,i,j; int x=4,y=2; p=(int **)malloc(y*sizeof(int *)*x); for(i=0;i<x;i++)p[i]=(int *)malloc(sizeof(int)*y); test(p); for(i=0;i<x;i++) for(j=0;j<y;j++) printf("p[%d]{%d]:%d\n",i,j,p[i][j]); for(i=0;i<x;i++)free(p[i]); free(p); } または、 #include <stdio.h> #include <stdlib.h> void test(int *p){ int x,y; for(x=0;x<4;x++) for(y=0;y<2;y++) p[y*4+x]=y*4+x; } void main(void){ int *p,i,j; int x=4,y=2; p=(int *)malloc(sizeof(int)*(x*y)); test(p); for(i=0;i<x;i++) for(j=0;j<y;j++) printf("p[%d*4+%d]:%d\n",j,i,p[j*x+i]); free(p); }
その他の回答 (3)
- bnosuke-x
- ベストアンサー率39% (43/110)
連続投稿すみません。 /* malloc でp[4][2]を確保 */ ここを具体的に書いていただけませんか?
お礼
私の記述は以下です。 /* 動的配列確保 */ pos = (int**)malloc(sizeof(int*)*nn); if(pos==NULL) exit(1); for(i=0;i<nn;i++){ pos[i] = (int*)malloc(sizeof(int)*2); if (pos[i]==NULL) exit(1); } memset(pos,0,sizeof(int)*(nn)*(2)); ebinamoriさんの記述(malloc)でもやりました。 また、ebinamoriさん記述のソースリストは問題なくコンパイル&実行できます。 私の場合は、test関数の中でいろいろな計算を行っています。 malloc を止めて「int p[4][2]」にすると問題なく実行できます 現象としては、確保した空間以外にアクセスしたからダメ(配列の先頭がいきなり)、です。 表記の件から外れていってますので、ここらで打ち切らせて下さい。 貴重な時間を頂きまして、本当にありがとうございます。
- bnosuke-x
- ベストアンサー率39% (43/110)
test((int [][2])p); でどうですか?
- herbest
- ベストアンサー率42% (15/35)
test( p ); void test( int **p ){ printf("%3d", p[0][0]); これで行けませんか?
お礼
ありがとうございます。 Visual C++ Express Edition を使用しています。 コンパイルはできましたが、実行させることはできませんでした。 (例外が発生???)何かしてはダメのような気がします。 本当にありがとうございました。
お礼
ありがとうございます。 Visual C++ Express Edition を使用しています。 コンパイルはできましたが、実行させることはできませんでした。 (例外が発生???)何かしてはダメのような気がします。 本当にありがとうございました。