• 締切済み

malloc使用後のメモリアロケーションエラー(MS-C7.0)

初めて投稿させていただきます。 現在PC:98 OS:MS-DOS 言語:MS-C7.0のhugeモデル という環境で プログラミングを行っております。しかし、config.sys,autoexec.batを 工夫してもメモリ不足を補えず、変数と動的にすることにしました。 c言語のテキストを参考に kansu() { char *p; p=(char *)malloc(256*256*sizeof(char)); if(p=null) printf("メモリ確保に失敗"); ・ ・ free(p); } とすると kansu終了直後に"メモリアロケーションエラー"がでます。 自分ではどこが悪いのわからず、ここでお聞きすることにしました。 上記の中の原因、もしくは原因と考えられることを教えてください。 よろしくおねがいします。

みんなの回答

  • Fooky
  • ベストアンサー率71% (59/82)
回答No.4

問題のソースコードでは、 if(p == null) printf("..."); なのか、それとも質問どおり、 if(p = null) printf("..."); なのか、どちらなんでしょう? 後者なら、bagyoさんの回答で決まりなんじゃ ないでしょうか?ただ、if(p = null)と書いた とき、まずp=nullの代入計算が行われ、その 結果のpの値がifの条件判断に使われます。 したがって、if(null)としたのと同一なわけで、 その後のprintfのメッセージは表示されない と思います。 後者の場合でもう一つ気になるのは、MS-Cは 知らないですが、Linuxのfreeシステムコールでは、 free(null)とした場合、何の動作も行われません。 MS-Cでもそのようになっているとすると、 pにnullが代入されていることによる影響は ないはずです。 前者の場合、pにはmallocが返した正しいアドレスが 入っています(malloc後にpに値を代入したり、単項 演算子を適用したりしていない限りですが)。 私の失敗の経験から言って、mallocやfreeで エラーがでるときには、ヒープ破壊が原因で あることが多いです。ヒープとは、mallocで動的に 割り当てられたメモリのことで、ヒープ破壊とは、 mallocで割り当てられたメモリを超えて書き込みを 行い(例えばこの例では、p[70000] = 1とかすることです)、 ヒープメモリ領域を破壊することです。 ですから、関数kansuの中で、p[65535]を超えて書き込みを していないかをチェックしてみたらいいかもしれません。また、 他にもmallocを行っている場所があれば、そちらもチェックして みてください。

すると、全ての回答が全文表示されます。
  • bagyo
  • ベストアンサー率40% (16/40)
回答No.3

こんにちわ。   if(p=null)の部分は、比較しているので、代入演算子の=ではなく、==で比較しなければならないと思います。 現在の状態では、pにNULLが代入されているので、最後のfreeでメモリを開放するときに、0番地を指しているので、その結果でアロケーションエラーを起こしていると思います。 ただ、この場合ですと p=null というのは真になるはずなので、"メモリ確保に失敗"というエラーメッセージを吐いているのではないかと思うのですが、いかがでしょうか?

すると、全ての回答が全文表示されます。
  • selenity
  • ベストアンサー率41% (324/772)
回答No.2

私はTurboCユーザだったのでMSCの事は よくわかりませんが、 char *p; だとnearポインタになり、64kまでしか 取れなかったような気がします。 char far *p; または char huge *p; としてfarポインタかhugeポインタを 使う必要があるかもしれません。 farmalloc()、farfree()なんて関数がありませんか? 違っていたら、ごめんなさい、、、m(_ _)m

すると、全ての回答が全文表示されます。
  • takebe
  • ベストアンサー率65% (17/26)
回答No.1

if (p=null) ... は if (p==null) の間違いではないですかね. あと,・・の中はどういった処理をしているのでしょうか.

すると、全ての回答が全文表示されます。

関連するQ&A