- ベストアンサー
多次元配列を動的に取る方法で悩んでいます。
現在、以下のコードで三次元配列を動的に取る方法を作成しています。 { int i,j; char ***Regdata; LPVOID heapAdr; Regdata = (char ***)HeapAlloc(GetProcessHeap(),HEAP_NO_SERIALIZE,sizeof(char) * 1000); for(i=0;i<=1000;i++){ heapAdr = HeapAlloc(GetProcessHeap(), //ここでエラーが発生します。 HEAP_NO_SERIALIZE | HEAP_ZERO_MEMORY, sizeof(char) * 6); if(heapAdr != NULL) { Regdata[i] = (char **)heapAdr; for(j=0;j<=6;j++){ heapAdr = HeapAlloc(GetProcessHeap(), HEAP_NO_SERIALIZE | HEAP_ZERO_MEMORY, sizeof(char) * STRING_LENGTH); if(heapAdr != NULL) { Regdata[i][j] = (char *)heapAdr; } else { break; } } } else { break; } } } この方法だと、約40~50回ループした時点でHeapAlloc関数のところで 実行時エラーが発生してしまいます。 GetLastError関数を用いてエラーメッセージを取得したところ、 「No 998:メモリの場所に無効なアクセスがありました。」 というメッセージが返ってきました。 現状、どうしたらよいのかわからない状態です。 ご存知の方がいらっしゃれば、お教えいただきたいです。 以上、宜しくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
取得するサイズを間違っています。例えば、最初の 1000 個分とるところは、 sizeof(char) ではなく、sizeof(char**) ですね。 割り当てるポインタの領域が少ないため、書き込みがオーバランして、いずれ アクセス例外が出ます。 二箇所直せば大丈夫なんじゃないですか? { ... Regdata = (char ***)HeapAlloc(GetProcessHeap(),HEAP_NO_SERIALIZE,sizeof(char**) * 1000); /* ここと */ for(i=0;i<=1000;i++){ heapAdr = HeapAlloc(GetProcessHeap(), //ここでエラーが発生します。 HEAP_NO_SERIALIZE | HEAP_ZERO_MEMORY, sizeof(char*) * 6); /* ここ */ if(heapAdr != NULL) { ... } else { break; } } }
その他の回答 (1)
- wolv
- ベストアンサー率37% (376/1001)
私は素人ですが, 動的ではなく,静的にそのサイズのメモリーを確保することはできますか? あるいは, 動的に,ただし,一気にその合計サイズ分のメモリーを確保することはできますか? これらができないなら, そもそもその実行系(OSとかパソコンとか,そのパソコンに搭載されているメモリー量)ではこのプログラムの扱うデータサイズは扱えない, あるいは, 実行時のヒープ領域のサイズを大きくするようなコンパイルオプションをつけて コンパイルする必要がある, ということだと思います.
お礼
お早い回答、有難うございました。参考になりました。
お礼
おっしゃる通り、ご指摘のところを修正しましたら作成できました。有難うございました。