本当にメモリ取れているのか? – プログラミング – Home

本当にメモリ取れているのか?
 
通知
すべてクリア

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


きた
 きた
(@きた)
ゲスト
結合: 23年前
投稿: 32
Topic starter  

ビルド ⇒ デバッグの開始 ⇒ 実行
でデバッグをやっているのですが、
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
 tib
(@tib)
ゲスト
結合: 23年前
投稿: 468
 

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


返信引用
きた
 きた
(@きた)
ゲスト
結合: 23年前
投稿: 32
Topic starter  

tibさん

ありがとうございます。

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

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

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

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


返信引用
きた
 きた
(@きた)
ゲスト
結合: 23年前
投稿: 32
Topic starter  

ちなみに今気付きましたが、
実際の計算上では

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


返信引用
tib
 tib
(@tib)
ゲスト
結合: 23年前
投稿: 468
 

C言語としては「ABC[D]」と「*(ABC+D)」は等価です。
同様に「&(ABC[D])」と「(ABC+D)」も等価です。

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

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


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 24年前
投稿: 252
 

とりあえず,デバッガはABCの指す先がfloat型のオブジェクトなのか,
float型のオブジェクトの配列なのかはわかりません,というか知る術がありません。
なので,ABCの指す先にfloatが一つしかないように見えるのでしょう。

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


返信引用
きた
 きた
(@きた)
ゲスト
結合: 23年前
投稿: 32
Topic starter  

すみません。
さっそく済みのマーキングしておきます。

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

ただ、どうしてもひっかかることがあって、
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等のエリアは
十分読み書き出来ると思うのですが、
どうなのでしょうか?

困ってしまいました。


返信引用
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

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

int cnt;

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

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


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 24年前
投稿: 252
 

> さっそく済みのマーキングしておきます。

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

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


返信引用
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

追記

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

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

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


返信引用
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

何回もすみません、

自宅の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のバグ???


返信引用
ひみつ
 ひみつ
(@ひみつ)
ゲスト
結合: 23年前
投稿: 2
 

mallocの引き数がsize_t(unsigned int)型だからうまくいっていないのでは?


返信引用
ひみつ
 ひみつ
(@ひみつ)
ゲスト
結合: 23年前
投稿: 2
 

ごめんなさい。↑
ちょっとボケてintを16bitで計算してました。
実際32bitなんで大丈夫でした。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました