- ベストアンサー
配列の大きさ
こんにちは、 ちょっとしたことがわからないので、書きこみました。 int a (int hikisuu1, int hikisuu2){ int b[hikisuu1]; } 当然ながら、上のソースは、エラーがでます。 関数内で扱う配列の大きさを引数によって決める方法を 教えてもらえるよう、お願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
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にしろ、メモリを動的に取得するため、 メモリが割り当てられたかどうかの確認をやっておいたほうが無難です。
その他の回答 (5)
- aaaaa
- ベストアンサー率40% (4/10)
どうでもよい補足です。 私が初めてmallocを知ったときの疑問点です。 既に他のかたがおっしゃってるように int *b=(int *)malloc(sizeof(int)*hikisuu1); で問題は解決です。b[3],b[8]とかで配列と同じようにアクセスできます。 (int *)の意味はキャストの意味です。 malloc という関数の戻り値がvoid*型なので int *bに代入するためにキャストが必要なんです。 もう知っていたらごめんなさいです。。。
- natural
- ベストアンサー率37% (419/1115)
No.3の回答者です。 他の方の仰っている様にfree()が必要ですね。 私のコードの場合、returnの前に、 free(b); が必要でした。 バグの元ですね。(^_^; 失礼しました。
- natural
- ベストアンサー率37% (419/1115)
通常の配列の要素数として引数を使用することは出来ません。 配列の要素数は定数でなければならないからです。 従って実現する為には他の手段が必要になります。 例えば以下の様にです。 int a (int hikisuu1, int hikisuu2){ int *b; b=(int*)malloc(sizeof(int) * hikisuu1); ・ ・ ・ return 0; } このように動的なエリアを確保する様にするのが一つの解決策だと思います。 尚、何を返却するのか判りませんでしたので、とりあえず0としました。 また、hikisuu2も未使用です。
- wogota
- ベストアンサー率42% (66/154)
静的な配列割り当てでは、長さは定数(アセンブラを通すときに決定している値)である 必要があります。 ここでは、動的な割り当てを行います。Cでは、もっぱら、malloc関数を使います。 題と同じ変数名を用いると、 int *b; b= (int*)malloc( sizeof(int)* hikisuu1); (処理) free(b); と、静的割り当てと異なり、配列の使用の必要が無くなれば、free関数で 解放する必要があります。
- nagata
- ベストアンサー率33% (10/30)
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をしないとメモリリークが起きます。 ご注意を。