初めて投稿させていただきます。
現在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件)
- 最新から表示
- 回答順に表示
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を行っている場所があれば、そちらもチェックして
みてください。
No.3
- 回答日時:
こんにちわ。
if(p=null)の部分は、比較しているので、代入演算子の=ではなく、==で比較しなければならないと思います。
現在の状態では、pにNULLが代入されているので、最後のfreeでメモリを開放するときに、0番地を指しているので、その結果でアロケーションエラーを起こしていると思います。
ただ、この場合ですと p=null というのは真になるはずなので、"メモリ確保に失敗"というエラーメッセージを吐いているのではないかと思うのですが、いかがでしょうか?
No.2
- 回答日時:
私はTurboCユーザだったのでMSCの事は
よくわかりませんが、
char *p;
だとnearポインタになり、64kまでしか
取れなかったような気がします。
char far *p;
または
char huge *p;
としてfarポインタかhugeポインタを
使う必要があるかもしれません。
farmalloc()、farfree()なんて関数がありませんか?
違っていたら、ごめんなさい、、、m(_ _)m
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- Windows 7 Windows7でMicrosoft VirtualPC2007 SP1を使用する 9 2022/11/17 13:12
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
allocってなんですか?
-
newしないオブジェクトについて
-
CreateFileMapping について
-
メモリを確保する方法(アセン...
-
void*型のデータサイズ
-
malloc使用後のメモリアロケー...
-
C言語 mallocとfreeについて
-
入れ子になった構造体について
-
c言語のポインタへの文字列入力...
-
newでrealloc?
-
座標値を読み込んである領域に...
-
Accessで、メモリを開放するタ...
-
Win32APIでのメモリ管理について
-
C++のnewで確保したメモリーの...
-
fread関数および動的なメモリ確...
-
スタック破壊の上手な見つけ方...
-
VBAのプログラムで、DIAG = 1# ...
-
C言語 配列の長さの上限
-
関数から配列を返すには?
-
構造体のextern方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語のポインタへの文字列入力...
-
allocってなんですか?
-
newしないオブジェクトについて
-
mallocについて
-
配列の添え字の最大数とは?
-
ヒープメモリの解放について
-
ビットをローテートするプログ...
-
C++で、メンバもヒープに確保さ...
-
malloc呼び出し時のセグメンテ...
-
プログラムが途中で強制終了し...
-
指定したメモリアドレスの値の...
-
スタック破壊の上手な見つけ方...
-
void*型のデータサイズ
-
ポインタのポインタの初期化法
-
free関数で動作が止まる
-
callocの処理速度
-
MSDNがgethostbynameではなくge...
-
C++のnewで確保したメモリーの...
-
sprintf()の使い方について
-
Accessで、メモリを開放するタ...
おすすめ情報