みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

c++ 構造体がメモリを食いすぎている?

始めに環境を書いておきます。
1台目
OS:winXP Pro
RAM:768MB
コンパイラ:borland c++ compiler 5.5

2台目
OS:win7
RAM:3GB
コンパイラ:vc++ 2008


プログラムの冒頭部分だけ書き出します

------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100

typedef struct{
________char author[128];
________char title[MAX/4][128];
________int valuation[MAX/4];
________char path[MAX/4][512];
________int sigData;//有効な(タイトルの)データ数
}FolderInfo;
------------------------------------------------

このままだとコンパイラではエラーを吐かないですが、
実際に実行してみると、異常終了してしまいます。(2台目)
また、1台目は異常終了の表示は出ないのですが、main関数すら通りません。
-----------------------
int main(void)
{
________printf("check");
-----------------------
のようにprintfを入れてみたのですが表示されませんでした。

1台目のborland turb debugger?でデバッグしてみると
「Not enough memory to load symbol table」
といきなり出てきます。symbol tableは検索では出てきますし、わかるような気もするのですが、何故このようなメッセージが出てくるのかが判りません。

また、
#define MAX 100

#define MAX 10
とすると異常終了を起こさずに、普通に実行されます。(これは1台目、2台目ともに)
なので、メモリが足りないのかと思ったのですが・・・
そんなに消費するものでしょうか?

投稿日時 - 2011-09-17 13:19:15

QNo.7016676

困ってます

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

1.5メガバイトもの領域をローカル変数に取るのだから、
コンパイラあるいは実行環境によってはトラブルを起こしかねません。
ローカル変数に許されたスタック領域は数MBに満たない処理系が少なくありません。
mallocを使ってヒープから領域を確保すればもっとたくさん使えます。

投稿日時 - 2011-09-17 22:28:28

お礼

mallocを使って、試したところ期待通りの動作をしました。
メモリなどを扱うようなプログラミングはあまりしたことがなく、なぜmalloc関数があるの?などと疑問に思っていました。
今回、このような問題に直面して初めてこの関数の、またメモリの確保というのが大事だということがわかりました。
非常に勉強になりました。
ありがとうございました。

投稿日時 - 2011-09-17 23:49:09

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

スタック領域が不足しているのかもしれません。
mallocを使うとどうなるでしょうか?

投稿日時 - 2011-09-17 22:05:29

お礼

回答ありがとうございます。
さっそく使ってみたいと思います。

投稿日時 - 2011-09-17 23:42:22

ANo.2

なによりも 1 台目はコンパイラ/デバッガを動かすにはメモリが少なすぎると思うので、2台目でデバッグしてみたほうがいいと思いますよ。それから、どちらのでもいいので同じバイナリを双方のPCで動かしてみたほうがいいです。コンパイラが変わればコンパイル結果に相違がでますので。

プログラムだけ見ても、エラーの内容やエラーが出ている場所がわからないと、なかなか推測もできないですよ。

投稿日時 - 2011-09-17 21:53:18

お礼

回答ありがとうございます。
今、メインで使ってるPC(2台目)は実家に帰っていて、使えない状態です。回答時は使えたのですが・・・
すいません。

投稿日時 - 2011-09-17 23:36:20

ANo.1

sizeof(FolderInfo) の値はいくつになりますか?
そのサイズをもった構造体をいくつ確保していますか?

投稿日時 - 2011-09-17 16:51:58

補足

ちなみに、以下のはすべて1台目のPCで確認しました。

投稿日時 - 2011-09-17 19:36:17

お礼

早速の回答ありがとうございます。
----------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100

typedef struct{
________char author[128];
________char title[MAX/4][128];
________int valuation[MAX/4];
________char path[MAX/4][512];
________int sigData;//有効な(タイトルの)データ数
}FolderInfo;

int main(void)
{
________unsigned int size;

________size = (unsigned int)sizeof(FolderInfo);
________printf("%d\n", size);

________return 0;
}
----------------------------------

として、調べた結果、出力は
16232
となりました。
また、本来のソースコードは下のように続くので、
FolderInfoの確保数はMAXの100ということでいいのでしょうか?

------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100

typedef struct{
________char author[128];
________char title[MAX/4][128];
________int valuation[MAX/4];
________char path[MAX/4][512];
________int sigData;//有効な(タイトルの)データ数
}FolderInfo;

int main(void)
{
________FolderInfo FI[MAX];

------------------------------------------------

投稿日時 - 2011-09-17 19:35:05

あなたにオススメの質問