• ベストアンサー

配列の動的確保を関数化

main()内でいくつかの配列を動的確保するとごちゃごちゃするので、 関数化してみました。しかし、下のプログラムではうまい事いきませ んでした。 #include<stdio.h> #include<stdlib.h> void array1d(int *box,int n) { int i; box=(int *)malloc(n * sizeof(int)); for(i=0; i<n; i++) { box[i]=0; } } main() { int *pol,i,n; printf("N pol\nN = "); scanf("%d",&n); array1d(pol,n); for(i=0; i<n; i++) { printf("[%d]=%d\n",i,pol[i]); } } 実行結果は [0]=-14646387 [1]=-1819410433 [2]=-224 array1d内では0を格納していますが、このようになりました。 どのようにすれば 0になるでしょうか? 回答よろしくお願いします。

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

  • ベストアンサー
  • nerosuke
  • ベストアンサー率33% (39/115)
回答No.3

もっと素直に考えた方がいいですよ。 動的にとるなら、関数内で確保すればいいのでは? 但しメモリの確保開放は入り口と出口が明示的にわかった方がいいので、あまり関数を分けて確保したり、開放したりするのは私的にお勧めできません。 ちょっと質問者のソースをいじってみました。 これでよいのではないですか? #include<stdio.h> #include<stdlib.h> //動的に確保するなら別に引数に渡さず確保した先頭アドレスだけ返せば良い! int *array1d(int n) { int i; int *box; box=(int *)malloc(n * sizeof(int)); for(i=0; i<n; i++) { box[i]=0; } return box; } main() { int *pol,i,n; printf("N pol\nN = "); scanf("%d",&n); pol = array1d(n); for(i=0; i<n; i++) { printf("[%d]=%d\n",i,pol[i] ); } //必ず開放して下さい。 free(pol); }

ume-kun
質問者

お礼

これなら納得です! わかりやすく教えていただいてありがとうございました!

その他の回答 (2)

  • yosi_yosi
  • ベストアンサー率35% (165/468)
回答No.2

void array1d(int *box,int n) を void array1d(int **box,int n) として、 box=(int *)malloc(n * sizeof(int)); for(i=0; i<n; i++) { box[i]=0; } を *box=(int *)malloc(n * sizeof(int)); for(i=0; i<n; i++) { (*box)[i]=0; } 理由はポインタのことをよーく考えてください。 ポインタのポインタはわかりづらいかもしれませんが、がんばって理解しましょう。

ume-kun
質問者

お礼

回答ありがとうございます。参考にします。

  • driverII
  • ベストアンサー率27% (248/913)
回答No.1

array1d の引数はintのポインタですよね。 ここでは[intのポインタ]=[int配列]のポインタを渡さなければなりませんよね。 ですので、mainで、array1dを呼ぶところで array1d(&pol,n); としなければなりませんし、他のところもそれに合わせて変えなければなりません。

ume-kun
質問者

お礼

回答ありがとうございます。参考にします。

関連するQ&A

  • mallocで引数に変数を入れると警告がでます

    #include<stdio.h> int main(void){ int n,i; int* array; puts("n=?"); scanf("%d",&n); array = (int*)malloc(sizeof(int) * n); for(i=0;i<n;i++) *(array+i) = i; for(i=0;i<n;i++) printf("%d ",*(array+i)); puts(""); return 0; } C言語で、上述のプログラムをコンパイルしたところ、 9: warning: incompatible implicit declaration of built-in function ‘malloc’ と警告がでます。 ./a.outで普通に実行できるのですが、 警告がでるということは、もっと正しいやり方があるということでしょうか?

  • ポインタ配列の動的確保

    ポインタの配列の動的確保について教えてください。 入力した数値をポインタ配列に入れるプログラムです。 下記のように書いてみました。(見づらくてごめんなさい) #include<stdio.h> #include<stdlib.h> #define kensu 3 main() { char abc[kensu+1]={'A','B','C','\0'}; char *ptr[kensu]; int i; printf("3つの整数を入力して下さい。\n"); for(i=0;i<kensu;i++){ ptr[i]=(char*)malloc(sizeof(char)*10); if(ptr[i]==NULL){ printf("メモリの取得に失敗しました"); exit(1); } printf("整数%c:",abc[i]); fgets(ptr[i],10,stdin); if(ptr[i][strlen(ptr[i])-1]=='\n') ptr[i][strlen(ptr[i])-1]='\0'; } for(i=0;i<kensu;i++) free(ptr[i]); } ちゃんと動いているようです。 しかし、ポインタ配列の動的確保をネットで調べてみると、ポインタのポインタ(?)を使って、下記のように2度mallocしています。 #include <stdio.h> #include <stdlib.h> #define N 3 int main(void) { char** arr; int i,j; arr = (char**)malloc(N * sizeof(char*)); /* ポインタ配列を確保 */ /* 配列の要素それぞれにつき、メモリ領域を確保 */ for(i=0;i<N;i++) arr[i] = (char*)malloc(N * sizeof(char));   ・・・ ポインタの配列を宣言して、配列の各要素に動的確保するのと ポインタのポインタを宣言し、ポインタ配列を動的確保して、再度配列の要素に動的確保するのとでは、何か違いがあるのでしょうか? ポインタのポインタを宣言し、ポインタ配列を確保する必要性が良く分かっていないのです。 ネット等で調べて見たのですが、理解力がないのかよく分かりませんでした。 どうか教えてください。

  • C言語 動的なメモリの確保 コンパイル時エラーも警告もないのに実行できない

    配列A[3]を{2, 4, 6}と初期化させ、malloc関数を使いメモリを確保しそこへ先程の配列Aの要素を記憶させ、ポインタ*Nを使い確保したメモリの要素を表示するプログラムです。 ********************************************* #include <stdio.h> #include <stdlib.h> int main(void) {   int A[3] = {2, 4, 6};   int i;   int *N;   N = (int *) malloc (3);   for(i = 0; i < 3; i++){     N[i]= A[i];   }   for(i = 0; i < 3; i++){     printf("%d", N[i]);   }   free(N);   return 0; } ********************************************* VCを使いF10のデバッグテストでは正常に動くのですが、コマンドラインからではエラー報告画面がでます。なぜなのでしょうか?

  • 関数とポインタ

    整数Mを素因数分解して、その素因数を*primeに入れておきたいんですが、mainの方で呼び出すと違う値になってしまいます。。 同じ値になるようにしたいのですが…どなたかお願いします(>_<) #include<stdio.h> #include<stdlib.h> #define MAX 256 int prime_fac(int M, int* prime) { int i, n; i = 1; n = 2; while(M != 1){ while(M % n == 0){ *(prime+i) = n; printf("%d\n", *(prime+i)); M = M / n; i++; } n++; } return i; /*素因数の個数(重複あり)*/ } int main(){ int M; int *prime; prime = (int *)malloc(sizeof(int) * MAX); printf("M: "); scanf("%d", &M); prime_fac(M, prime); printf("%d\n", *prime); printf("%d\n", *prime+1); free(prime); return 0; }

  • 行列の計算【配列 関数】

    行列式を計算する関数をもちいてプログラムを見やすくしたいのですが、何回やっても値の渡し方がわかりません。 他にも逆行列のプログラムなどの渡し方も知りたいです。 以下が時ビンで考えたプログラムです。 #include <stdio.h> double det(double array[3][3]); int main( void ) { int i,j,k,n=3; double array[3][3],d; for(i=0;i<3;i++) { for(j=0;j<3;j++) { printf( "A[%d,%d]=",i+1,j+1); scanf( "%lf",&array[ i ][ j ] ); } } printf("det= %f \n",det(array[][])); return 0; } double det(double array[][]) { double array[3][3]; d=array[0][0]*array[1][1]*array[2][2]; d+=array[1][0]*array[2][1]*array[0][2]; d+=array[2][0]*array[0][1]*array[1][2]; d-=array[2][0]*array[1][1]*array[0][2]; d-=array[1][0]*array[0][1]*array[2][2]; d-=array[0][0]*array[2][1]*array[1][2]; return d; } よろしくお願いします。

  • malloc関数の使い方について(初心者)

    膨大なデータ数を扱うためにmalloc関数を用いて配列にデータを格納し、それを表示するプログラムを考えました。コンパイルはできるのですが、実行するとエラーが起こります。freeの開放の仕方が間違っているのでしょうか?よろしくお願いします。 /*ソース*/ #include <stdio.h> #include <stdlib.h> #define N 130000 int main(void) { double *p; int i; p = malloc(N); if(!p){ printf("割り当てエラー"); exit(1); } for(i=0;i<N;i++){ p[i]=i; printf("%f\n",p[i]); } free(p); }

  • 「動的確保した2次元配列のメモリ解放」を関数化したい

    質問タイトルの通りですが、 「動的確保した2次元配列のメモリ解放」をC言語で関数化したいと思っています。しかし、関数の引数には動的確保した配列の先頭アドレスのみ渡す形にしたいです。そのような場合の関数化は可能ですか? どうもうまくいかず、困っています。 以下、具体的に、サンプルソースを記述します。 わかる方、よろしくお願いします。 //====================================================// #include<stdio.h> unsigned char** AllocByteArray2d(int column, int row); void FreeByteArray2d(unsigned char** box); int main(voidls){ unsigned char array**; array = AllocByteArray2d(2, 3); FreeByteArray2d(array); return 0; } unsigned char** AllocByteArray2d(int column, int row){ unsigned char* box; box = (unsigned char**)malloc( sizeof(unsigned char*)*column ) int i; for(i=0; i<column; i++){ box[i] = (unsigned char*)calloc( row, sizeof(unsigned char)); if(box[i] == NULL) exit(EXIT_FAILURE); } return box; } //引数では配列の先頭アドレスだけ渡す形にしたい void FreeByteArray2d(unsigned char** box){ //ここをどう書いたらいいかわからない }

  • C言語 エラー表示 break の位置が誤っている(関数 main ) 

    #include<stdio.h> int main(void){ int n,i,j,k; char c='*'; printf("正の整数:"); scanf("%d",&n); if(n>0){ for(i=1;i<=n;i++){ printf("%d",i); for(j=1;j<=n+1-i;j++){ if(j==1){ if(i-1>0){ for(k=i-1;k>0;k--){ printf(" "); } } } printf("%c",c); } printf("\n"); } } break; return 0; } これをコンパイルすると「break の位置が誤っている(関数 main )」と表示されるのですが何でですか? 困ってます↓

  • 関数のパラメータを配列に格納したいのですが

    #include<stdio.h> #include<stdlib.h> int func(int, int, int, int); int main(void) { int a = 3, b = 4, c = 5, d = 6; int sum; sum = func(a, b, c, d); printf("合計は%dです。\n", sum); return EXIT_SUCCESS; } int func(int m, int n, int o, int p) { int Hairetu[4]; int Sum = 0; int i; /* ここで、Hairetuにm, n, o, pを格納したい */ for(i=0; i<4; i++) Sum += Hairetu[i]; return Sum; } 例えばこのようなプログラムがあった時、m, n, o, pの値をHairetuに格納するには、どのようにすればよいのでしょうか。 分かりにくい文章ですが、どうかよろしくお願い致します。

  • 構造体配列のメモリ確保

    以下のようなプログラムを作りました。 make_mem関数のなかで構造体のメモリを確保し、 データを代入しています。 しかし、mainに返ってくると値が代入されていません。 よく調べてみると、mainで宣言してあるdataのアドレスが 変更されていません。 どのようにすれば、meake_memoのなかでメモリ確保し、 データを代入できるのでしょうか? 教えてください。 実際の使用しているプログラムはmake_memoのなかで DBを開き、そのデータを配列に代入しているので、 main関数の中では配列の大きさがわかりません。 #include <stdio.h> typedef struct { int a; int b; }DATA; int make_mem(DATA *data){ int i; data=(DATA *)calloc(10,sizeof(DATA)); printf("calloc %p\n",data); for (i=0;i<10;i++){ data[i].a = i; printf("data[%d].a = %d\n",i,data[i].a); } return 0; } int main(int argc,char *argv[]){ DATA *data; int i; printf("before %p\n",data); make_mem(data); printf("after %p\n",data); for (i=0;i<10;i++){ printf("data[%d].a = %d\n",i,data[i].a); } return 0; }

専門家に質問してみよう