C言語関係掲示板

過去ログ

No.961 大量の構造体のメモリ確保

[戻る] [ホームページ]
No.12324

構造体のメモリー確保!
投稿者---T.M(2004/01/29 20:57:32)


こんにちは。
ある決まったメモリー量でいいのですが、構造体の
メモリーを確保する方法はありますか?
プログラムを実行使用とするとエラーが出てしまいます。
メモリー不足かな?と思っているのですが・・・。

typedef struct          
    double X;
    double Y;
    double Z;
    double VX;
    double VY;/
    double VZ;
    double R;
}CONDITION;

CONDITION clusterC[30000];




みたいな構造体が他にもいくつかあります。30000を小さい
数にするとエラーは起きないのですが・・・。
構造体を配列にすることはできなくもないんですが、できれは
このままでいきたいです。アドバイスよろしくお願いします。


No.12330

Re:構造体のメモリー確保!
投稿者---nop(2004/01/30 11:09:16)


関数内でのローカル変数の場合、
多くの環境ではスタック領域に auto 変数を確保します。
そのため、auto 変数の中に大きな配列を宣言すると、
スタックオーバーフローが起きたりします。

この場合の対応としては

・「static」を付けて静的なものにする
・malloc()などを用いて動的に領域を確保する

などがあります。

No.12331

Re:構造体のメモリー確保!
投稿者---NykR(2004/01/30 12:19:14)


>こんにちは。
>ある決まったメモリー量でいいのですが、構造体の
>メモリーを確保する方法はありますか?
>プログラムを実行使用とするとエラーが出てしまいます。
>メモリー不足かな?と思っているのですが・・・。
>例
>
typedef struct          
    double X;
    double Y;
    double Z;
    double VX;
    double VY;/
    double VZ;
    double R;
}CONDITION;

CONDITION clusterC[30000];



>
>みたいな構造体が他にもいくつかあります。30000を小さい
>数にするとエラーは起きないのですが・・・。
>構造体を配列にすることはできなくもないんですが、できれは
>このままでいきたいです。アドバイスよろしくお願いします。

ポインタの配列にして、一個ずつmallocで確保すると、配列そのものは小さくできます。

No.12332

Re:構造体のメモリー確保!
投稿者---たか(2004/01/30 12:58:10)


Cでは構造体にC++のように代入演算子やコピーコンストラクタを含むよう
な事がないので、配列が足りなくなる度realloc()を呼び出してもよいで
しょう。但しその時1個ずつ伸ばしていたらものすごく時間がかかるので、
10000個ずつ増やすとか倍々になるとか工夫が望まれます。

しかし、こうしても、配列の添え字を超えた事をキャッチして配列の大き
さを自動的に伸ばすような器用な事はできません。ここら辺の事情はstd::vector
でも同じで、メンバ関数at()を使わないと未定義の動作となっています。

そこら辺は自動的に伸ばすようにするよりユーザが責任を持って伸縮する
方が気づかぬバグを混入する可能性が低くなるからでしょう。

No.12349

Re:構造体のメモリー確保!
投稿者---NykR(2004/01/30 17:46:51)


しかし、こうしても、配列の添え字を超えた事をキャッチして配列の大き さを自動的に伸ばすような器用な事はできません。ここら辺の事情はstd::vector でも同じで、メンバ関数at()を使わないと未定義の動作となっています。

Cでも、ポインタを構造体のメンバにして、隠蔽してしまえば、関数を使わないと要素の追加ができないので、自動的に伸びる配列のようなものを作ることができますね、要素を追加する関数にそういう機能を持たせることによって。

いや、まあ単に可能だというだけの話でそれが良いかどうかは別問題ですが。