OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
締切り
済み

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

  • すぐに回答を!
  • 質問No.103453
  • 閲覧数738
  • ありがとう数1
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 0% (0/4)

初めて投稿させていただきます。
現在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終了直後に"メモリアロケーションエラー"がでます。
自分ではどこが悪いのわからず、ここでお聞きすることにしました。
上記の中の原因、もしくは原因と考えられることを教えてください。
よろしくおねがいします。
通報する
  • 回答数4
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

回答 (全4件)

  • 回答No.1
レベル8

ベストアンサー率 65% (17/26)

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

あと,・・の中はどういった処理をしているのでしょうか.
  • 回答No.2
レベル12

ベストアンサー率 41% (324/772)

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

違っていたら、ごめんなさい、、、m(_ _)m
  • 回答No.3
レベル8

ベストアンサー率 40% (16/40)

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

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

ベストアンサー率 71% (59/82)

問題のソースコードでは、 if(p == null) printf("..."); なのか、それとも質問どおり、 if(p = null) printf("..."); なのか、どちらなんでしょう? 後者なら、bagyoさんの回答で決まりなんじゃ ないでしょうか?ただ、if(p = null)と書いた とき、まずp=nullの代入計算が行われ、その ...続きを読む
問題のソースコードでは、
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を行っている場所があれば、そちらもチェックして
みてください。
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ