• ベストアンサー

配列の動的確保を関数化

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

専門家に質問してみよう