C言語初心者です。
配列について質問させて頂きます。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int hako[40000][6];
int i,j;
for(i=0; i<40000; i++){
for(j=0; j<6; j++){
hako[i][j]=i;
}
}
printf("%d %d %d %d %d\n",hako[i-1][0],hako[i-1][1],hako[i-1][2],hako[i-1][3],hako[i-1][4]);
return 0;
}
上記のソースであれば問題は無いのですが、int hako[40000][6]が40000を超えるとプログラムが無言で終了します。
恐らくメモリの問題だとは思うのですが(汗
この配列を増やす為にはどうしたら良いのでしょうか?
どうぞ、宜しくお願い致します。
No.2
- 回答日時:
「C言語 ローカル変数 巨大」とか「C言語 ローカル変数 スタック」とかで検索してみましょう。
・プロセスのスタックサイズを大きくする。(やり方はコンパイラ依存かな)
・動的確保する。
・グローバル変数にする。
・static変数にする。
かなぁ……。
Wr5さん ありがとう御座います。
教えて頂いたキーワードで検索してみたのですが…
む、難しいですね((((^^;
スタックサイズを増やす方法や、具体的な方法を教えて頂けたら助かるのですが(汗
コンパイラ依存と言う事は、このコンパイラではこれが限界と言う事でしょうか?
何も知らない素人で申し訳ありませんが、御教授をお願いします。
No.3
- 回答日時:
静的配列はサイズ変更できないし、そもそも巨大なロ-カル変数は
ご法度(スタックのサイズが足りなくなると落ちる)。
また、Cは配列のインデックスをチェックしないし、配列外へのアクセスは
何が起きるか分からないのが、Cの怖いところです。
配列の領域を動的に増やすには mallocなどでメモリを取得し直す
しかありません。
tknakamuriさん ありがとう御座います。
少し理解し始めました、mallocにも辿り付きました(汗
第二配列をmallocで動的にする良いサンプルがあれば御教授下さい。
No.5
- 回答日時:
「第二配列」ってなんだろう.
あと, Visual Studio といってもいろいろなものがあります. Express や Community だったら手を出す余裕もあるんじゃないかな.
Tacosanさん 二次元配列でした(^^;
御教授ありがとう御座います。
何とかmallocで二次元配列の使い方が分かり、何とか解決に漕ぎ付きました。
この場を借りて、回答頂いた皆様、ありがとう御座います。
また、困ったら御教授の程を宜しくお願い致します。
No.6
- 回答日時:
二次元配列…でしょうかね?>#5
「C言語 多次元配列 malloc」とかで検索すると、多次元配列を動的確保する方法が書かれたページが見つかるでしょう。
全部纏めて取る場合と、1次元配列を個別にmallocで取っていく方法がありますが。
http://pukulab.blog.fc2.com/blog-entry-28.html とか
http://www.booran.com/menu/c/multi_pointer.html とか
# 後者の場合だと連続した領域にならないので注意が必要な上、malloc()/free()の回数が増えるのでキツいでしょうね。
# malloc()した場合に消費されるヒープは要求サイズより多くなるでしょうし。(ライブラリの管理用の分が余計に取られる)
Visual Studioならリンカの設定でスタックサイズが指定できた…はずです。(デフォルト1Mでしたっけね?)
動的確保で面倒だったら…おすすめはしませんがstaticにするかグローバルに取るか…でしょうかねぇ。
No.7
- 回答日時:
どこかで「スタックのデフォルトサイズは 1 MB」と見た記憶があります>#6. 個人的には 2 MB の方がきりがいいんじゃないかなぁとか思ったりもしますが.
あとちなみに
hako = (int**)malloc(sizeof(int*) * 100000);
for(i=0; i<100000; i++){
hako[i] = (int*)malloc(sizeof(int)*5);
for(j=0; j<6; j++){
hako[i][j]=i;
}
}
はバグってるので注意.
Tacosanさん 質問に書いたソースでは動いたのですが…
本当のプログラムに書き込むと… 落ちました(^^;
やっぱり難しいですねぇ~
まだ全く解決してなかったです(汗
No.8
- 回答日時:
https://msdn.microsoft.com/ja-jp/library/tdkhxak …
何故か2つオプションがあるようですが…Visual Studio(VC++)では1Mですね。
>hako = (int**)malloc(sizeof(int*) * 100000);
>hako[i] = (int*)malloc(sizeof(int)*5);
malloc()の実行回数がステキなことになるので、ライブラリが管理用に取るメモリもその分増えるので注意しましょう。
# 実装によりますが…「1つ前のメモリブロックの管理用構造体へのポインタ」「次のメモリブロックの管理用構造体へのポインタ」「確保したサイズ」があった場合、ポインタ2つ分とint型(long型?)分余分に取られます。
さらに…malloc()に失敗する可能性も考慮が必要でしょう。
# まぁ、最初に大きく取って…という方法の場合だと「連続した空き領域がないからmalloc()が失敗する」という可能性も出てくるのですが。
>本当のプログラムに書き込むと… 落ちました(^^;
>hako[i] = (int*)malloc(sizeof(int)*5);
取ったのはint型「5個」分で、
>for(j=0; j<6; j++){
このループは「何回」まわりますか?
wr5さん
本当に初歩的な部分で…(^^;
0から何だからと頭にあるのですが、どうしても習性的に1から物事が始まってしまうのですよねぇ(-_-;
教えて頂いたサイトを参照して、
int **hako = (int**)malloc(100000 * sizeof(int*));
for(i=0; i<100000; i++){
hako[i] = malloc(sizeof(int) * 5);
}
ドカンと取って動かしてみました。
取り敢えず、上手く廻っているのかな?
現在実行させている最中です。
ちゃんと終わってくれると嬉しいなぁ(^^;
No.9
- 回答日時:
/F はコンパイラドライバーである cl に対するオプション, /STACK は実際にリンクをする link へのオプションだったと思います>#8. つまり
cl /F:10000000 なんとか
と実行すると, リンクのときに
link /STACK:10000000 なんか
と実行する, だったはず.
Tacosanさん 返事が遅れて申し訳ありません。
と、取り敢えず、メモリをガバッと取ってぶん回しています(^^;
コンパイラのオプションでも変更出来るのですね勉強になります。
何だかドンドンハードルが上がってくるなぁ(汗
No.10ベストアンサー
- 回答日時:
メモリを一気にとって実行するサンプルです。
--------------------------------------
#include <stdio.h>
#include <stdlib.h>
struct mytable {
int hako[40000][6];
};
int main(void)
{
struct mytable *ptr;
int i,j;
ptr = malloc(sizeof(struct mytable));
if (ptr == NULL){
printf("malloc error\n");
return 1;
}
for(i=0; i<40000; i++){
for(j=0; j<6; j++){
ptr->hako[i][j]=i;
}
}
printf("%d %d %d %d %d\n",ptr->hako[i-1][0],ptr->hako[i-1][1],ptr->hako[i-1][2],ptr->hako[i-1][3],ptr->hako[i-1][4]);
return 0;
}
-------------------------------------
実行結果
39999 39999 39999 39999 39999
tatsu99さん ありがとう御座います。
素敵な位に奇麗なソースです!!!
いやぁ~~~ 理解されてえる方は本当に理解しきってますねと。
何も言い様がありません!
こう言うのをスルっと書けるスキルまで登り詰めたい物です♪
感謝、感謝です!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# 10人分の生徒の英語の点数{32,34,41,38,40,26,14,46,42,50} と数学の点 2 2022/05/26 21:31
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数から配列を返すには?
-
C言語の課題が出たのですが自力...
-
c言語
-
コンボボックスでデフォルト値...
-
C言語において、 配列要素をひ...
-
100の階乗のプログラムって
-
配列の要素数に変数を入れたい...
-
C言語 プログラミング 関数につ...
-
C言語についてです 5人のテスト...
-
C言語 ファイルの指定された行...
-
配列のアドレス部
-
int i, int i[1];
-
c言語プログラミング 等差数列...
-
2番目の最大値を求める
-
C#で構造体の配列を持った構造...
-
C言語 構造体でつまずいています
-
要素数・要素の値が未定の配列...
-
define で 配列
-
c言語 構造体
-
C言語の配列のコピーについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
-
define で 配列
-
c言語
-
C#で構造体の配列を持った構造...
-
構造体のextern方法
-
C言語において、 配列要素をひ...
-
C#でのフィボナッチ数列
-
C言語の2次元配列 容量が大き...
-
C#で配列が空かを判定するには?
-
配列のアドレス部
-
char型配列をint型に代入するには
-
2番目の最大値を求める
-
C言語の課題が出たのですが自力...
-
C言語についてです 5人のテスト...
-
C言語から質問です。
-
C言語 ファイルの指定された行...
-
c言語 構造体
-
コンボボックスでデフォルト値...
-
MFCのCArrayを使った二次元配列
おすすめ情報
hako = (int**)malloc(sizeof(int*) * 100000);
for(i=0; i<100000; i++){
hako[i] = (int*)malloc(sizeof(int)*5);
for(j=0; j<6; j++){
hako[i][j]=i;
}
}
こんなんで回るのですね(^^;
知ると目から鱗な感じです(汗