ページ 11

メモリ領域の確保と構造体の宣言

Posted: 2008年5月07日(水) 09:39
by ふっきー
struct v4_so v4_so_data[10000]によりv4_so型構造体v4_so_dataを10000個宣言したいのですが、
コンパイルして実行すると、メモリ領域が確保できずに実行がストップしてしまいます。
メモリ領域を確保する命令 malloc(sizeof(struct v4_so)*10000) を先頭に書きましたが、
それでもまだ動きません。
おそらく、malloc(sizeof(struct v4_so)*10000)により確保された領域に、
10000個のv4_so_dataをうまく配置することが出来ていないのだと思います。
どうすればいいのでしょうか?よろしくお願いします。

Re:メモリ領域の確保と構造体の宣言

Posted: 2008年5月07日(水) 10:08
by たかぎ
> メモリ領域を確保する命令 malloc(sizeof(struct v4_so)*10000) を先頭に書きましたが、
> それでもまだ動きません。

具体的にどう書いたのですか?
単に配列を使いたいだけなら、
struct v4_so v4_so_data[10000];
でよいはずです。

環境が不明なので正確なことはいえませんが、C90では1個のオブジェクトににつき32767バイトまでしか保証されませんので、struct v4_so型が4バイト以上であればこの制限にかかってくる可能性はあります(多分問題ないと思います)。

Re:メモリ領域の確保と構造体の宣言

Posted: 2008年5月07日(水) 10:11
by バグ
mallocを使用して動的に確保していのならば…

v4_so* pt = (v4_so*)malloc(sizeof(v4_so) * 10000);

こんな感じでしょうか?

何にせよ、たかぎさんの言われるように、ふっきーさんがどうのように書いたのかによって回答が変わってきそうに思いますね。

Re:メモリ領域の確保と構造体の宣言

Posted: 2008年5月07日(水) 15:09
by ふっきー
/* メモリの確保 */
struct v4_so* pt = (struct v4_so*)malloc(sizeof(struct v4_so) * 10000);

/* 変数の宣言 */
struct v4_format v4_format_data;
struct v4_so v4_so_data[10000];

現在このような状況です。構造体v4_soは文字配列を含むためかなり大きいです。
コンパイルは通りますが、メモリの確保する所でシグウィンがとまってしまいます。

Re:メモリ領域の確保と構造体の宣言

Posted: 2008年5月07日(水) 15:15
by box
「かなり大きい」だと状況がよくわからないです。
sizeof(struct v4_so) の値はいくらですか?

Re:メモリ領域の確保と構造体の宣言

Posted: 2008年5月07日(水) 15:18
by ふっきー
sizeof(struct v4_so)の値は1584です。

Re:メモリ領域の確保と構造体の宣言

Posted: 2008年5月07日(水) 15:51
by keichan
> struct v4_so v4_so_data[10000];
これ、スタックに確保しちゃいますがいいのでしょうか?
mallocで確保したptを使用するようにしても落ちますか?

TO keichan

Posted: 2008年5月07日(水) 15:55
by ふっきー
> struct v4_so v4_so_data[10000];
これ、スタックに確保しちゃいますがいいのでしょうか?
mallocで確保したptを使用するようにしても落ちますか?

いえ、mallocで確保したptの使用法方法がわからないんです。。。。。。。

Re:TO keichan

Posted: 2008年5月07日(水) 16:33
by toyo
/* メモリの確保 */
struct v4_so* v4_so_data = (struct v4_so*)malloc(sizeof(struct v4_so) * 10000);
if (v4_so_data == NULL) {
    fprintf(stderr, "malloc error\n");
}
で後は普通に配列としてアクセスできます。
v4_so_data[0] ~ v4_so_data[9999]

to toyo

Posted: 2008年5月07日(水) 16:52
by ふっきー
toyoさん、できました!
他の方々のお話も、とても参考になりました。
皆さんありがとうございました。