本当にメモリ取れているのか?

[戻る]
きた 2002/10/31(木) 21:10:48
ビルド ⇒ デバッグの開始 ⇒ 実行
でデバッグをやっているのですが、
    static     float *ABC;
  :::::::::::::::
    ABC = (float *) malloc(10 * 256 * 50 * 30 * sizeof(float));
    if (ABC == NULL)
  {
        printf("Memory Kakuho Dekizu! \n");
        exit(10);
  }
ABCOK:;
  として、
  無事ABCOKのラベルのところまで通り抜けて来たので
  安心して、
  ウオッチでABCと指定してメモリを見たところ、
  何故かフロートで1つしか展開できていないのですが。
   10*256*50*30個分の浮動小数点値が見れると思ったのですが、
  何がおかしいのでしょうか?
  逆に言うとそのようになっていないと先が進まないのですが。
  

tib 2002/10/31(木) 21:19:33
ポインタで宣言しているのに配列のようにウォッチしたい、ということでしょうか。例え
ばクイックウォッチで「*(ABC+nn)」みたいにして評価することは出来ますか?

きた 2002/10/31(木) 21:29:05
tibさん

ありがとうございます。

意図としてはその通りです。

今、わざと変数を
*(ABC+100) = 8.3;
というようなことをやって
本当に反映されているのか確かめてみました。

確かに反映されています。
確保されているということですね。

但し、メモリの一つ一つずつでは無くて、
ずらーっと、
*ABCから*(ABC+1000)まで1000個分
といったようにまとめて一気にメモリの中味を
覗くことは出来ないのでしょうか?

きた 2002/10/31(木) 21:35:18
ちなみに今気付きましたが、
実際の計算上では

ABC[D] = 345;
という使い方をしていますが、
*(ABC+D) = 345;
という使い方をしないといけない
ということですね。
それで、
ABC[D]としても見えなかったのではないか、と。

tib 2002/10/31(木) 21:47:50
C言語としては「ABC[D]」と「*(ABC+D)」は等価です。
同様に「&(ABC[D])」と「(ABC+D)」も等価です。

言語としては等価だがVC++のwatch機能としては違いがあるというだけ、と解釈するのが
自然ではないでしょうか。


ところで他の方からも指摘を受けているようですが、あなたが質問した(と思われる)ス
レッドのうち未解決のものがいくつかあるようですが、それらはどうなっていますか?

YuO [E-Mail] 2002/10/31(木) 21:59:18
とりあえず,デバッガはABCの指す先がfloat型のオブジェクトなのか,
float型のオブジェクトの配列なのかはわかりません,というか知る術がありません。
なので,ABCの指す先にfloatが一つしかないように見えるのでしょう。

あまり,ウォッチを過信しないことです。

きた 2002/10/31(木) 22:06:01
すみません。
さっそく済みのマーキングしておきます。

今、上記のものがイコールであるということを確認しました。

ただ、どうしてもひっかかることがあって、
ABC = (float *) malloc(10 * 256 * 50 * 30 * sizeof(float));
でメモリは確保されているようなのに、
あざ実地で使うとなると、
ABC[1012]まではメモリが見れているのに、
ABC[1013]より高いメモリにおいては、何故か
全ての領域、

ABC[1013]    CXX0030: Error: 式を評価できません
ABC[385530]    CXX0030: Error: 式を評価できません
というコーションがウオッチで出て来ます。
(1012までは、*(CepEachS+1012)    -1.99840e+018
 というように大丈夫なのに            )


そういうことで計算がここでハンドルされていない例外は
TEST.exeにあります。 0xC0000005;ACCESS VIOLATION
というメッセージが出て止まるようなのです。
10 * 256 * 50 * 30で取ったのだし、
ここでメモリが確保出来なかったというエラーがMALLOC
でエラーが出ていないはずだから、
これら上から1013とか285530等のエリアは
十分読み書き出来ると思うのですが、
どうなのでしょうか?

困ってしまいました。

アイススケーター 2002/10/31(木) 23:10:43
ABC = (float *) malloc(10 * 256 * 50 * 30 * sizeof(float));

を

int    cnt;

cnt = 10 * 256 * 50 * 30 * sizeof(float);
ABC = (float *) malloc( cnt);

とするとうまく確保できました。

YuO [E-Mail] 2002/10/31(木) 23:12:43
> さっそく済みのマーキングしておきます。

「どうやって解決したか」が抜けていますよ。
それ無しに「済」のマークだけつけても意味がありません。


でもって,_msizeを使って確保したメモリサイズを確かめてみてはどうでしょう。
おかしければ,HeapAllocなどに逃げる,という緊急手段があります。

アイススケーター 2002/10/31(木) 23:14:12
追記

ABC = (float *) malloc(10 * 256 * 50 * 30 * sizeof(float));

の場合は、メモリの確保ができませんでした。
メモリウォッチで確認したら参照できませんでした。

??なぜかは、私も不明です。 明日また調べてみます。

アイススケーター 2002/11/01(金) 08:10:18
何回もすみません、

自宅のWin98の環境では、
  ABC = (float *) malloc(10 * 256 * 50 * 30 * sizeof(float));
とすると確保できず、
会社のWin2000では成功しました。???

ちなみにfree後のメモリ状態をWin98で見たら
  cnt = 10 * 256 * 50 * 30 * sizeof(float);
  ABC = (float *) malloc( cnt);
の場合ですがfree後も一部のエリアが参照できました。???
これって私の場合は、Win98の問題なんですかね。
詳しい方がいらっしゃったら私も知りたいです。

Win98のバグ???

ひみつ 2002/11/01(金) 10:52:46
mallocの引き数がsize_t(unsigned int)型だからうまくいっていないのでは?

ひみつ 2002/11/01(金) 13:22:56
ごめんなさい。↑
ちょっとボケてintを16bitで計算してました。
実際32bitなんで大丈夫でした。

古いスレッドには追加発言できません。