OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

配列の大きさ

  • 暇なときにでも
  • 質問No.152379
  • 閲覧数60
  • ありがとう数0
  • 気になる数0
  • 回答数6
  • コメント数0

お礼率 17% (17/95)

こんにちは、
ちょっとしたことがわからないので、書きこみました。

int a (int hikisuu1, int hikisuu2){
int b[hikisuu1];


}
当然ながら、上のソースは、エラーがでます。
関数内で扱う配列の大きさを引数によって決める方法を
教えてもらえるよう、お願いします。
通報する
  • 回答数6
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.5
レベル6

ベストアンサー率 66% (6/9)

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にしろ、メモリを動的に取得するため、
メモリが割り当てられたかどうかの確認をやっておいたほうが無難です。
-PR-
-PR-

その他の回答 (全5件)

  • 回答No.1
レベル8

ベストアンサー率 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 , ...続きを読む
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をしないとメモリリークが起きます。
ご注意を。
  • 回答No.2
レベル10

ベストアンサー率 42% (66/154)

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

ここでは、動的な割り当てを行います。Cでは、もっぱら、malloc関数を使います。

題と同じ変数名を用いると、

int *b;
b= (int*)malloc( sizeof(int)* hikisuu1);

(処理)

free(b);

と、静的割り当てと異なり、配列の使用の必要が無くなれば、free関数で
解放する必要があります。
  • 回答No.3
レベル13

ベストアンサー率 37% (419/1115)

通常の配列の要素数として引数を使用することは出来ません。 配列の要素数は定数でなければならないからです。 従って実現する為には他の手段が必要になります。 例えば以下の様にです。 int a (int hikisuu1, int hikisuu2){  int *b;  b=(int*)malloc(sizeof(int) * hikisuu1);    ・    ・    ・ ...続きを読む
通常の配列の要素数として引数を使用することは出来ません。
配列の要素数は定数でなければならないからです。
従って実現する為には他の手段が必要になります。
例えば以下の様にです。

int a (int hikisuu1, int hikisuu2){
 int *b;

 b=(int*)malloc(sizeof(int) * hikisuu1);
   ・
   ・
   ・
 return 0;
}

このように動的なエリアを確保する様にするのが一つの解決策だと思います。

尚、何を返却するのか判りませんでしたので、とりあえず0としました。
また、hikisuu2も未使用です。
  • 回答No.4
レベル13

ベストアンサー率 37% (419/1115)

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

 free(b);

が必要でした。
バグの元ですね。(^_^;
失礼しました。
  • 回答No.6
レベル8

ベストアンサー率 40% (4/10)

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

既に他のかたがおっしゃってるように
int *b=(int *)malloc(sizeof(int)*hikisuu1);
で問題は解決です。b[3],b[8]とかで配列と同じようにアクセスできます。

(int *)の意味はキャストの意味です。
malloc という関数の戻り値がvoid*型なので
int *bに代入するためにキャストが必要なんです。

もう知っていたらごめんなさいです。。。
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ