• ベストアンサー

配列の大きさ

こんにちは、 ちょっとしたことがわからないので、書きこみました。 int a (int hikisuu1, int hikisuu2){ int b[hikisuu1]; } 当然ながら、上のソースは、エラーがでます。 関数内で扱う配列の大きさを引数によって決める方法を 教えてもらえるよう、お願いします。

  • lmi
  • お礼率17% (17/95)

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

  • ベストアンサー
  • soakun
  • ベストアンサー率66% (6/9)
回答No.5

mallocを使用してもよいのですが、 配列の値を全て 0初期化しておきたい場合もあります。 そういった場合は、 int a (int hikisuu1, int hikisuu2){ int *b; b = (int*)calloc(hikisuu1, sizeof(int)); if(b == NULL) { /* メモリが割り当てられなかった場合の処理 */ } /* メモリが割り当てられた場合の処理 */ free(b);  return 0; } というように、callocを使用します。 また、mallocにしろ callocにしろ、メモリを動的に取得するため、 メモリが割り当てられたかどうかの確認をやっておいたほうが無難です。

参考URL:
http://www.bohyoh.com/CandCPP/C/Library/calloc.html

その他の回答 (5)

  • aaaaa
  • ベストアンサー率40% (4/10)
回答No.6

どうでもよい補足です。 私が初めてmallocを知ったときの疑問点です。 既に他のかたがおっしゃってるように int *b=(int *)malloc(sizeof(int)*hikisuu1); で問題は解決です。b[3],b[8]とかで配列と同じようにアクセスできます。 (int *)の意味はキャストの意味です。 malloc という関数の戻り値がvoid*型なので int *bに代入するためにキャストが必要なんです。 もう知っていたらごめんなさいです。。。

  • natural
  • ベストアンサー率37% (419/1115)
回答No.4

No.3の回答者です。 他の方の仰っている様にfree()が必要ですね。 私のコードの場合、returnの前に、  free(b); が必要でした。 バグの元ですね。(^_^; 失礼しました。

  • natural
  • ベストアンサー率37% (419/1115)
回答No.3

通常の配列の要素数として引数を使用することは出来ません。 配列の要素数は定数でなければならないからです。 従って実現する為には他の手段が必要になります。 例えば以下の様にです。 int a (int hikisuu1, int hikisuu2){  int *b;  b=(int*)malloc(sizeof(int) * hikisuu1);    ・    ・    ・  return 0; } このように動的なエリアを確保する様にするのが一つの解決策だと思います。 尚、何を返却するのか判りませんでしたので、とりあえず0としました。 また、hikisuu2も未使用です。

  • wogota
  • ベストアンサー率42% (66/154)
回答No.2

静的な配列割り当てでは、長さは定数(アセンブラを通すときに決定している値)である 必要があります。 ここでは、動的な割り当てを行います。Cでは、もっぱら、malloc関数を使います。 題と同じ変数名を用いると、 int *b; b= (int*)malloc( sizeof(int)* hikisuu1); (処理) free(b); と、静的割り当てと異なり、配列の使用の必要が無くなれば、free関数で 解放する必要があります。

  • nagata
  • ベストアンサー率33% (10/30)
回答No.1

Cならば int *b=(int *)malloc(sizeof(int)*hikisuu1); C++ならば int *b=new int[hikisuu1]; C++でSTLを使うなら vector<int> b(kikisuu1); と言う感じです。あとは int b[hikisuu1]としたときと同じように使えます。 上2つは 関数を抜けるときに free , deleteをしないとメモリリークが起きます。 ご注意を。

関連するQ&A

  • 引数に二重配列のある関数について

    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++を使用しています。 多次元配列を関数の引数として渡したいとき、関数側では void A::Func(int a[10][20][30])~ 呼びだし側では Finc(a); とやればいいのはわかります。 お聞きしたいのは、仮引数として呼び出された配列(上でいうa)をクラスのメンバ変数として保持したい場合の方法です。 aは先頭アドレスなのでそこを差すポインタを受ければいい、っていうことはわかりますが、 この方法ですと、受けたメンバ変数が配列みたいに[]を使ってアクセスできません。 (メンバ変数のポインタは配列じゃないから当然ですよね) これを通常の配列みたいに扱えるようにするにはどうしたらいいでしょうか。

  • 関数に配列を渡すときの質問です

    関数に配列を渡したいんですがこのソースが問題ないか見てください。 #include<stdio.h> #define N 10 #define M 20 int sig(int X[],int x); main() { int a[N],b[M],i,x,y; for(i=0 ; i<N ; i++){ a[i]=i; } for(i=0 ; i<M ; i++){ b[i]=i; } x=sig(a,N); y=sig(b,M); } int sig(int Z[],int x){ int i,k; k=0; for(i=0 ; i<x ; i++){ k=k+Z[i]; } return k; } ソースは以上です。 1つのソースの中でa[N]とb[M]のように違う数の 配列があるんですが、その配列全部(0~N-1、0~M-1)とかを足してくれる(シグマ)関数を作りたいんですが、Z[]と配列の数を指定しなくてもちゃんと動いてくれるんでしょうか?関数のほうの int x で配列の数を指定するようにしています。 自分でテストした限りではちゃんと動いているようなんですが、間違ってるようなら指摘お願いします。

  • 参考書にありますが削除しても結果は同じでした。

    #include <stdio.h> int kansuu(int hikisuu); int main() { int modori; modori = kansuu(2); printf("modori = %d\n", modori); return 0; } int kansuu(int hikisuu) { printf("kansuu de hyouji\n"); return hikisuu * 2; }  以上のプログラムは参考書の内容ですが、コンパイルした結果が、 kansuu de hyouji modori = 4  です。 二行目の   int kansuu(int hikisuu);がなくても、結果は同じでした。  参考書の説明では  「ここでは、関数kansuuの定義とプロトタイプ宣言に 、引数を追加しました。  引数の名前はhikisuuとして、int型の値を記憶できるようにしました。  int kansuu(int hikisuu); ←関数に引数を追加」  以上、  なぜ!参考書はint kansuu(int hikisuu);があるのかがわかりません!?  よろしくお願いします。  

  • 配列の確保の仕方

    C言語でプログラムを記述していますが、 確保している配列が多すぎるためか、 access vilation at ・・・ などのエラーが出ます。 <プログラム> #define A 1000 #define B 10000 をグローバルで宣言して、各関数内でこれを用いて宣言しています。 int data[A][B]; double root[A][B];   ・   ・   ・ int score[A][A][B]; などを初めにたくさん宣言しています。 聞くところによると、動的に確保すればいい、とも聞いたんですが、あまり意味がわかりません。 上のエラーメッセージが出ないようにするにはどうすればいいのでしょうか? この説明だけでお分かりいただけないなら、言っていただければ詳しく言います。

  • 配列

    適当な記述ですが、次を見てください。 void roll(int *c) { int n, b2[8]; if(t<3) { for(n=0; n<8; n++) b2[n]=c[n]; for(n=0; n<8; n++) c[b2[n]]=7-n; for(n=0; n<8; n++) printf("%d",c[n]); printf("\n"); t++; roll(c); } else t=0; } int main() { int b[]={3,6,4,0,7,2,5,1}; roll(b); for(n=0; n<8; n++) printf("%d",b[n]); //36407251が表示されるようにしたい。 return(0); } rollが何の関数かは省略しますが、rollにmainのb(ポインタ?)を渡し、ある処理をして,それでmainに戻ってきた時にb[]を表示すると、36407251が表示されません。 ポインタを引数にするってことはポインタでさしてるとこをrollで操作してるわけですよね? そうすれば変わって当然だとはおもいます。 でも関数1で関数2に配列1を渡し、その関数2の中でで配列1の値が変化しても、元の関数1にもどれば配列1のまま変化していないようにするにはどうすればいいですか? やはり もう1つ配列を用意しなきゃだめなのでしょうか。

  • C言語 関数プロトタイプ宣言の引数に配列を入れたいのですが

    関数プロトタイプ宣言(自作関数)の引数に、A[4][4]というような配列を入れたいのですが、コンパイル時にエラーでincompatibleといわれてしまいます。 A[0][0]からA[3][3]までを個別に引数に指定してもエラーになります。 良い方法は無いでしょうか?

  • どちらの説明をしているのかがわかりません?

    http://okwave.jp/qa/q8798932.html の  の中に int kansuu(int hikisuu); ←関数に引数を追加  がありますが!  ”関数に引数を追加”の説明で、”関数”とは!intのことを言っているのか、それとも kansuuを言っているのかが分かりません?    よろしくお願いします。

  • 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 紙にも書いて何回も見直しましたが、どこがおかしいのかわかりませんでした。 どうすれば良いのでしょうか? 何か良いアドバイスをよろしくお願いします。

  • 配列について。

    配列について質問なんですが int a[6]={1,2,3,4,5,6}; int b[3]={6,32,4}; という配列を宣言し、この二つの配列を足す方法はどのようなやりかたがあるのでしょうか? つまり cc[]という新たな配列を作り cc[9]={1,2,3,4,5,6,6,32,4}; とするにはどのように記述すればいいのでしょうか? 教えて頂ければ幸いです。