- ベストアンサー
配列を引数にする方法
ebinamoriの回答
#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); }
関連するQ&A
- 関数先にて配列の長さを取得する方法
関数にて、引数にて渡された配列(ポインタ)から配列数を調べる方法はないでしょうか? #include <stdio.h> void test(unsigned int *p){ printf ("%d\n", sizeof(*p)/sizeof(p[0])); //結果 1 } int main(){ unsigned int hoge[] = {0x30, 0x31,0x32}; test(hoge); printf("%d", sizeof(hoge)/sizeof(hoge[0])); //結果3 return 1; } 上記コードの関数testの*pから配列の数3が抜き取りたいと思っております。 よろしくお願いします。
- ベストアンサー
- C・C++・C#
- 引数に二重配列のある関数について
void calc(int *a,int b,int c){ a[0]=b+c; a[1]=b-c; } void main(void){ int x[2]; int y=2,z=5; calc(x,y,z); printf("x[0]=%d,x[1]=%d\n",x[0],x[1]); } 上のように引数が普通の配列の関数ならできるのですが, 引数が下のような多重配列になるとエラーが出てしまいできません。 void keisan(int **a,int b,int c){ a[0][0]=b+c; a[0][1]=b-c; a[1][0]=b*c; a[1][1]=b/c; } void main(void){ int x[2][2]; keisan(x,6,2); printf("x[0][0]=%d,x[0][1]=%d\n",x[0][0],x[0][1]); printf("x[1][0]=%d,x[1][1]=%d\n",x[1][0],x[1][1]); } 引数に多重配列を使った場合の関数の作り方について教えてください. お願いいたします.
- ベストアンサー
- C・C++・C#
- 引数で指定された配列の要素数の取得
どうもこんにちは。 C言語でプログラムを作成しています。 ある関数に配列を渡すことを考えていますが、渡した配列の要素数を取得する方法は何かありますか? 標準の関数を見ても、配列の先頭アドレスのポインタとともに、配列の要素数を渡しているものばかりで、配列のポインタを渡しているものは見かけません。 要素数があらかじめわかっていれば、それを引数の型に指定できますが、呼び出されるまで不明な場合はうまくいきません。 配列の要素数も引数として一緒に渡す必要がありますか? [作ってみたサンプル] #include <stdio.h> #include <stdlib.h> #include <string.h> // func1 と func2 をまとめられないだろうか。。。 void func1(int (*p)[10]) { ________int n = sizeof(*p) / sizeof((*p)[0]); ________int i; ________for (i = 0; i < n; i++) { ________________printf("%d\n", (*p)[i]); ________} ________printf("\n"); } void func2(int (*p)[5]) { ________int n = sizeof(*p) / sizeof((*p)[0]); ________int i; ________for (i = 0; i < n; i++) { ________________printf("%d\n", (*p)[i]); ________} ________printf("\n"); } int main(int argc, char *argv[]) { ________int ary1[10] = { 2, 4, 6, 8, 0, 1, 3, 5, 7, 9 }; ________int ary2[5] = { 3, 6, 9, 12, 15 }; ________func1(&ary1); ________func2(&ary2); ________return 0; }
- ベストアンサー
- C・C++・C#
- 2次元配列を引数とする関数について
2次元配列を引数とする関数について 私は今、2次元配列を引数とする関数の表を作るという課題に取り組んでいます。 条件として、int a[数字][数字]={{1,2,3...}}という配列の宣言と同時の初期化は使わず、 関数内で表の値を代入し、値を表示する関数を作り、事実上二つの関数を作るというものです。 私は以下のようなプログラムを作り、動かしましたが、[数字][数字]=********のような本来 あるべき実行結果とは異なる数字の羅列が出てきてしまいました。 ↓ #include <stdio.h> void func(int a[][6]); void fund(int b[4][6]); void main(void) { int a[4][6]; fund(a); func(a); } void func(int a[][6]) { int i,j,b[4][6]; fund(b); for(i=0;i<4;i++) { for(j=0;j<6;j++) { printf("a[%d][%d]=%d\n",i,j,a[i][j]); printf("\n"); } } } void fund(int b[4][6]) { int i,j; for(i=0;i<4;i++) { for(j=0;j<6;j++) { scanf("b[%d]*[%d]=%d\n",&i,j,b[i][j]); } } } 本来の実行結果 1 2 3 4 5 6 2 4 6 8 10 12 3 6 9 12 15 18 4 8 12 16 20 24 紙にも書いて何回も見直しましたが、どこがおかしいのかわかりませんでした。 どうすれば良いのでしょうか? 何か良いアドバイスをよろしくお願いします。
- ベストアンサー
- C・C++・C#
- 関数の引数表記なしについて
はじめまして。C言語初心者です。 質問させてください。 関数を宣言して引数を表記しないで使用することは可能なのでしょうか? またどのような場合に使用するのでしょうか? 例として以下コードになります。 ----------------------- #include<stdio.h> int test1(int a); void test2(int b); void main(){ int i = 0; int j = 0; //この部分 i = test1; printf("%d\n", i); //この部分 j = test2; printf("%p\n", j); } int test1(int a){ return a + 1; } void test2(int b){ printf("test"); } --------------------------- 出力結果を見ると関数のアドレスが帰ってくるように思われますが、詳細が分かりません。 詳しい方がいらしましたら教えてください。 宜しくお願いいたします。
- 締切済み
- C・C++・C#
- free()への引数について
下位にて動的に確保した領域を解放するのは以下のように すればよいのでしょうか?また解放されているか確認する方法はあるのでしょうか? void main(){ char *p = 0x00; if (0 != exaMalloc(&p)) { printf("err\n"); exit(); } free(&p); } int exaMalloc(**p) { *p = malloc(10); if (*p == 0x00) { return -1; } return 0; }
- ベストアンサー
- C・C++・C#
- 配列
こんばんは。 Cを勉強中の者なのですが 前に配列についての内容で自分も分からない事があったので投稿しました。 キーで文字列を入力して関数に渡し、 関数側で引数(文字列データ分)のメモリを確保する事は 出来るのでしょうか。 #include <stdio.h> #include <stdlib.h> void test(char *hiki); int main(void){ char inp[256]; scanf("%s",&inp); printf("%s\n",inp); test(inp); return 0; } void test(char *hiki){ char *i; i = (char*)malloc( ); /* 「hiki」をつかって出来るの でしょうか? */ 全然急ぎとかではなく、ちょっと疑問に思った事なのですが教えていただけるとうれしいです。 (考え方がおかしかったらスミマセン)
- ベストアンサー
- C・C++・C#
- コマンドライン引数について。
コマンドライン引数についての質問です。 コマンドライン引数に適当な数字をいれ、金種別にわけるプログラムですが、 コマンドライン引数に負の値や、文字列を入力したときにはエラーが表示させるようにしているのですが、 数字と文字を混合したもののときはエラーが表示されずにそのまま処理されてしまいます。 初めの一文字目が数字だったらそのあとに文字を入れても実行されてしまうようです。 全て数字の場合のみ実行させてそれ以外はエラーメッセージを表示させたいのですが、どのようにすればいいでしょうか? #include <stdio.h> #include <stdlib.h> int syubetu(int money,int *kinsyu); int *kinsyu; int main(int argc,char *argv[]) { int *p,a; p=(int*)malloc(sizeof(int)*9); if(p==NULL){ printf("メモリ確保失敗\n"); exit(1); } a=atoi(argv[1]); if(a>0){ syubetu(a,&p[0]); printf("1万円 %d枚\n",p[0]); printf("5千円 %d枚\n",p[1]); printf(" 千円 %d枚\n",p[2]); printf("5百円 %d枚\n",p[3]); printf(" 百円 %d枚\n",p[4]); printf("50円 %d枚\n",p[5]); printf("10円 %d枚\n",p[6]); printf(" 5円 %d枚\n",p[7]); printf(" 1円 %d枚\n",p[8]); } else{ printf("入力エラー\n"); exit(1); } } int syubetu(int money,int *kinsyu) 800字以上になるため、処理は省略します。
- ベストアンサー
- C・C++・C#
- 多元配列について(ANSI C)
動的多元配列で、 Voidポインタに、多種の型がぶら下がった多元配列を作り、 読み書きをしたいのですがどのようにしたらよろしいでしょうか。 具体的には、 x[0][1]は、intで「2」が入っている x[0][4]は、intで「9」が入っている x[1][2]は、charでしかも文字列の配列で「goo」が入っている x[1][5]は、charでしかも文字列の配列で「教えて」が入っている x[0]は、int型の配列。X[1]は、文字列型の配列。 というようなものです。 一応ソースは作ってみたのですが、int型では問題なくいくのですが、 文字列は、コンパイルはできますが、実行すると予期せぬことが起きます。 #include <stdio.h> #include <stdlib.h> #include <string.h> int main (void) { void **topPointa; int * iDataInput; int * iDataOutput ; char * chDataInput; char * chDataInput2; char * chDataOutput1 ; // ポインタアドレス用のメモリ確保 topPointa = (void *) calloc (10 , sizeof(void *)); if(topPointa == NULL) { printf("メモリが確保できません\n"); exit(-1); } //int配列のメモリ確保 iDataInput = (int * ) calloc (10 , sizeof(int)); if(iDataInput == NULL) { printf("メモリが確保できません\n"); exit(-1); } iDataInput[0] = 3 ; iDataInput[1] = 4 ; topPointa[0] = (void * ) &iDataInput; //int配列の取り出し iDataOutput = *(int *) topPointa[0]; printf( "int: %d\n", iDataOutput[0] ); printf( "int: %d\n", iDataOutput[1] ); //char配列 のメモリ確保 chDataInput = (char * ) calloc (10 , sizeof(char *)); if(chDataInput == NULL) { printf("メモリが確保できません\n"); exit(-1); } chDataInput2 = (char * ) calloc (10 , sizeof(char)); if(chDataInput2 == NULL) { printf("メモリが確保できません\n"); exit(-1); } strcpy(chDataInput2 , "hoe"); chDataInput[0] = &chDataInput2; topPointa[1] = (void * ) &chDataInput; //char配列の取り出し chDataOutput1 = *(char *) topPointa[1]; printf( "char: %S\n", chDataOutput1[0] ); free(iDataInput); free(chDataInput); free(chDataInput2); return 0; } 言語は、C言語ANCI Cでお願いします。 以上。よろしくお願いします。
- ベストアンサー
- C・C++・C#
お礼
ありがとうございます。 Visual C++ Express Edition を使用しています。 コンパイルはできましたが、実行させることはできませんでした。 (例外が発生???)何かしてはダメのような気がします。 本当にありがとうございました。