電子書籍の厳選無料作品が豊富!

初めて投稿させていただきます。
現在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終了直後に"メモリアロケーションエラー"がでます。
自分ではどこが悪いのわからず、ここでお聞きすることにしました。
上記の中の原因、もしくは原因と考えられることを教えてください。
よろしくおねがいします。

A 回答 (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を行っている場所があれば、そちらもチェックして
みてください。
    • good
    • 0

こんにちわ。


 
if(p=null)の部分は、比較しているので、代入演算子の=ではなく、==で比較しなければならないと思います。
現在の状態では、pにNULLが代入されているので、最後のfreeでメモリを開放するときに、0番地を指しているので、その結果でアロケーションエラーを起こしていると思います。

ただ、この場合ですと p=null というのは真になるはずなので、"メモリ確保に失敗"というエラーメッセージを吐いているのではないかと思うのですが、いかがでしょうか?
    • good
    • 0

私はTurboCユーザだったのでMSCの事は


よくわかりませんが、
char *p;
だとnearポインタになり、64kまでしか
取れなかったような気がします。
char far *p;
または
char huge *p;
としてfarポインタかhugeポインタを
使う必要があるかもしれません。
farmalloc()、farfree()なんて関数がありませんか?

違っていたら、ごめんなさい、、、m(_ _)m
    • good
    • 0

if (p=null) ... は if (p==null) の間違いではないですかね.



あと,・・の中はどういった処理をしているのでしょうか.
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!