VC++メモリウィンドウの使い方とは?

このQ&Aのポイント
  • VC++のメモリウィンドウを使用して、double型のポインタのポインタに入っている数値をチェックする方法についてわかりやすく説明します。
  • VC++のメモリウィンドウを使って、ポインタに入っている数値の表示内容を解読する方法について教えてください。
  • VC++のメモリウィンドウを利用して、double型のポインタのポインタに格納された数値を読み取る方法について簡単に説明します。
回答を見る
  • ベストアンサー

VC++のメモリウィンドウの使い方について

double型のポインタのポインタに入っている数値をチェックしたいのですが、表示内容の読み方がわかりません。 どのようにすればわかりやすいのでしょうか? 次のような形のポインタに入っている数値を見たいのです。 double **a; a=(double**)malloc(sizeof(double*)*5); for(i=0;i<5;i++) a[i]=(double*)malloc(sizeof(double)*5); これをメモリウィンドウで調べようとしてるんですが、 アドレス a 0012FF7C 0110 0048 FFC0 0012 0012FF84 36D9 0042 0001 0000 0012FF8C 0E60 0048 0DA0 0048 0012FF94 0000 0000 0000 0000 0012FF9C F000 7FFD 0000 0000 0012FFA4 0000 0000 FF94 0012 0012FFAC 0000 0007 FFE0 0012 0012FFB4 D8EC 0042 C0C8 0046 とズラーッっと出てきてよくわかりません。

質問者が選んだベストアンサー

  • ベストアンサー
  • togino
  • ベストアンサー率75% (97/129)
回答No.1

malloc が終わった段階で a = 0x00370FF0 だとします。(これは「ウォッチ」機能で確認できますよね) このアドレスをメモリウィンドに入力(コピペ)します。 0x00370FF0 40 10 37 00 a8 10 37 00 10 11 37 00 78 11 37 00 0x00371000 e0 11 37 00 fd fd fd fd ab ab ab ab ab ab ab ab すると、僕の場合こんな感じでした。 さて、double* は、4バイトですので、4バイトずつ区切って、5つ分が double[5] へのポインタです。 つまり、 1つ目 40 10 37 00 より 0x00371040 2つ目 a8 10 37 00 より 0x003710a8 3つ目 10 11 37 00 より 0x00371110 ・・・ って感じですね。 (1バイトごと後ろから読む点は理解されてますよね) では、次にメモリウィンドに 0x00371040 と入力します。 0x00371040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 f0 3f 0x00371050 00 00 00 00 00 00 00 40 00 00 00 00 00 00 08 40 すると僕の環境ではこうなりました。 さて、double は、8バイトですので、8バイトずつ区切って、5つ分が、それぞれ double の値を格納してます。 つまり、 1つ目 00 00 00 00 00 00 00 00 より 0.0 2つ目 00 00 00 00 00 00 f0 3f より 1.0 3つ目 00 00 00 00 00 00 00 40 より 2.0 ・・・ のようになります。 10進数の浮動小数点を2進法64ビット表現へ 相互変換する点がご存知ないのであれば、補足しますので ご存知かどうか教えてください。 --- つまり、a の値をメモリウィンドに入力。 そこから、4バイトごとアドレスを読み取って その値をメモリウィンドに入力。 そこから、8バイトごとに浮動小数点で読み取る いかがでしょう?

関連するQ&A

  • 配列ポインタの関数中のメモリ領域

    C初心者です。 関数中で配列ポインタを宣言する場合についての質問です。 たとえばDouble型の2次元のローカルな配列ポインタを用いる場合、 その配列要素数が100である場合は void 関数名(引数1,引数2,...){ int i; double *a[2]; for(i=0;i<2;i++){ a[i] = (double*)malloc(100*sizeof(double)); } for(i=0;i<2;i++){ free(a[i]); } } またこの値を引数1とする場合、引数1をoutとすると void 関数名(double *out,....) とし、 for(i=0;i<2;i++){ out[i] = a[i]; } とすればよいのでしょうか? もしこれがあっているとすると、つぎのような現象で困っています。 配列要素数を50000個ぐらいとし、複数の関数で、同様に mallocを用いて、配列ポインタのローカルでメモリ領域を確保しようとした場合、コンパイルは成功するのですが、その後実行すると、エラーが発生したというメッセージとともにコマンドウィンドが強制終了します。 コンパイラはVisual C++ EXpress Edition 2008です。 データサイズを小さくすると、エラーは起きません。 malloc関数で確保するメモリサイズは、関数の入力引数で定義された変数を用いて計算しており、データサイズに応じて変更されます。 よろしくお願いいたします。

  • 関数宣言

    3次元で領域を確保するプログラムをmalloc関数を用いて書きました。しかし、プログラムが長いので関数宣言をしなさいといわれたために、以下のプログラムを書きました。しかし、途中でつまづいてしまい、どのように関数を用いたり、関数を定義すれば良いのか混乱しています。初心者ですが、どうかお願いします。 /*ソース*/ #include<stdio.h> #include<stdlib.h> int main(){ double ***C; f3Malloc(C,.,.); //数値を代入(関数の使い方?) f3Free(C,.,.); } /*3次元配列(返し方?)*/ double*** f3Malloc(C,,){ int i,j,x,y,z; x = 2; y = 3; z = 4; C=(double***)malloc(sizeof(double**)*x*y*z); for(i=0;i<y;i++){ C[i]=(double**)malloc(sizeof(double*)*y*z); for(j=0;j<z;j++){ C[i][j]=(double*)malloc(sizeof(double)*z); } } } /*メモリの解放(返し方?)*/ void f3Free(C,.,.){ int i,j,x,y; x = 2; y = 3; for(i=0;i<x;i++){ for(j=0;j<y;j++){ free(C[i][j]); } free(C[i]); } free(C); }

  • 動的なメモリ領域の確保

    double型変数5個分のメモリをmalloc関数により確保し,その確保した要素のアドレスを表示するように,プログラムを作る問題で、 (注)に「 %pで表示するためには,double型へのポインタ(double *)をvoid型へのポインタ(void *)にキャストする必要がある.」と書かれていたのですが、どういうことでしょうか? 以下のようでいいのでしょうか? #include<stdio.h> #include<stdlib.h> #define COUNT 5           // 動的に確保するメモリ領域数を示すマクロ定数の定義 int main(void) {  // 動的に確保するメモリ領域のアドレスを保持するポインタ変数の宣言  double * pointer;  int i;                  // for文で使用する変数の宣言  // int型変数5個分のメモリ領域を確保  pointer = (double *)malloc(sizeof(double) * COUNT);  if(pointer == NULL) {        // メモリ領域の確保が失敗した場合   printf("メモリ領域を確保できませんでした.\n");   exit(1);                // プログラムの終了  }  for(i = 0; i < COUNT; i++)   printf("%d番目のアドレスは%pです.\n", i + 1, pointer + i);  free(pointer);            // 確保したメモリ領域の解放  return 0; }

  • 2次元配列を動的に確保する方法

    /*ネットの*/ w = (double **)malloc(sizeof(double*) * h); w[0] = (double *)malloc(sizeof(double) * v * h); for(i=0; i<h; i++) w[i] = w[0] + i *v; /*自分の*/ w = (double **)calloc(h, sizeof(double *)); for(i = 0; i < h; i++){ w[i] = (double *)calloc(v, sizeof(double)); 自分は初心者です。自分は下のようなコードで書いていたのですが ネットで見つけたコードで上のようにデータの領域を全部確保してから 2番目以降のポインタを割り当てるようなやり方をしていました。 そのやり方は初めて見たのですが、こっちのほうが一般的なやり方なんでしょうか? それと何かメリットはあるんでしょうか? 一度に確保した方が確実に連続領域に割り当てられるとかかなぁとか予想してるんですが・・・

  • malloc関数によるメモリの確保

    C初心者です。 malloc関数によるメモリの確保に関して教えてください。 2次元配列のサイズに対してmalloc関数の引数値をたとえば、 (double*)malloc(datasize*sizeof(double)) などとしメモリ領域を確保すると、メモリアドレスはデータのサイズ によらず一定 1234044、1234048となります。 データサイズを大きくし、datasize*sizeof(double)が16Kバイトを超えるとcmd.exeがエラーとなり落ちます。 デバックモードで実行すると 「"System.AccessViolationException"のハンドルされていない例外が不明なモジュールです。で発生しました。 追加情報:保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリがこわれていることが考えられます」 というメッセージがでます。 コンパイラはExpressEdition2008です。 この現象を回避するにはどうすべきか、なぜこのようなことが起こるのかご教授ください。 よろしくお願いいたします。

  • ポインタと型のサイズに関する、初歩的な質問

    ポインタと型のサイズについて、実験しています。 以下のプログラムを実行したときに、さらに下の 画面表示になるのですが、ここで疑問があります。 int型の配列を作ってそのポインタを表示しています。 i[0]のポインタ=0012FF38 i[1]のポインタ=0012FF3C 0012FF38 と 0012FF3C の間は16ビットなのに、 int型のサイズは4バイトとなってしまいます。 なぜでしょうか。 -------------プログラムここから-------------- #include <iostream> using namespace std; int main(){ int i[20]; for(int j = 0;j<20;j++){ printf("i[%d]のポインタ=%p\n",j, &i[j]); } printf("\n\nsizeof(int) = %d\n\n", sizeof(int)); return 0; } -------------プログラムここまで-------------- -------------画面出力ここから-------------- i[0]のポインタ=0012FF38 i[1]のポインタ=0012FF3C i[2]のポインタ=0012FF40 i[3]のポインタ=0012FF44 i[4]のポインタ=0012FF48 i[5]のポインタ=0012FF4C i[6]のポインタ=0012FF50 i[7]のポインタ=0012FF54 i[8]のポインタ=0012FF58 i[9]のポインタ=0012FF5C i[10]のポインタ=0012FF60 i[11]のポインタ=0012FF64 i[12]のポインタ=0012FF68 i[13]のポインタ=0012FF6C i[14]のポインタ=0012FF70 i[15]のポインタ=0012FF74 i[16]のポインタ=0012FF78 i[17]のポインタ=0012FF7C i[18]のポインタ=0012FF80 i[19]のポインタ=0012FF84 sizeof(int) = 4 -------------画面出力ここまで--------------

  • Windowsでは出るエラーでMacでは出ない

    現在、Visual C++ 2013 Expressを使っているのですが、そちらではエラーが出るのに、MacbookのXcodeで走らせたらエラーも出ずに正常に実行することができます。 いったい何が原因でエラーが起こっているのでしょうか? エラーメッセージは"XXXXX.exe has triggered a breakpoint."で"malloc.c"のタブがVC++上に開きます。以下がそのコードになるのですが、アドバイス宜しくお願い致します。 #define _USE_MATH_DEFINES #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <math.h> #include <iostream> #include <complex> #include <stdlib.h> using namespace std; typedef complex<double> dcmplx; complex<double> M_i = dcmplx(0, 1); //--------------------------------------------------------------- // Characteristic Function dcmplx* CharFunc(double alpha, double* nu, double s0, double r, double q, double sigma, double t, int N) { dcmplx* out = (dcmplx*)malloc(sizeof(dcmplx) * N); dcmplx* u = (dcmplx*)malloc(sizeof(dcmplx) * N); for (int j = 0; j < N; ++j){ // j = 1,...,N u[j] = nu[j] - (alpha + 1) * M_i; out[j] = exp(M_i*(log(s0) + (r - q - sigma*sigma / 2.0)*t)*u[j] - sigma*sigma * u[j] * u[j] * t / 2.0); } return out; } // Characteristic Function for C dcmplx CharFuncC(double u, double s0, double K, double r, double q, double sigma, double t, int N) { return exp(M_i*((log(s0) - log(K)) + (r - q - sigma*sigma / 2.0)*t)*u - sigma*sigma * u*u * t / 2.0); } //--------------------------------------------------------------- // Main int main(int, char**) { double alpha[] = { -1.2, -1.5, -5.0, -10.0 }; double eta; double s0; double r; double q; double sigma; double t; double K; int pow2; int N; int m_atm = 0; FILE *fp; if (!(fp = fopen("inputa.txt", "r"))){ printf("File \'inputa\' could not be opened!"); exit(-1); } fscanf(fp, "%lg%lg%lg%lg%lg%lg%d", &eta, &s0, &r, &q, &sigma, &t, &pow2); double a; double b; double v; double abs_ab[] = { 2.0, 5.0, 10.0, 20.0 }; double sum =0; for (pow2 = 7; pow2 <= 10; ++pow2){ N = (int)pow(2.0, pow2); double *nu = (double*)malloc(sizeof(double)* N);// nu * (b - a) / M_PI; double *Vp = (double*)malloc(sizeof(double)* N); double *chi = (double*)malloc(sizeof(double)* N); double *phi = (double*)malloc(sizeof(double)* N); dcmplx *Phi = (dcmplx*)malloc(sizeof(double)* N); for (int i = 0; i < 4; ++i){ b = abs_ab[i]; a = -b; cout << "N:" << N << ", (a, b): (" << a << ", " << b << ")" << endl; for (K = 1600; K <= 1900; K += 100){ for (int k = 0; k < N; ++k){ nu[k] = k * M_PI / (b - a); // chi for Put with (c,d) = (a,0) chi[k] = 1.0 / (1.0 + nu[k] * nu[k]) * (cos(nu[k] * (-a)) - exp(a) + nu[k] * sin(nu[k] * (-a))); // phi for Put with (c,d) = (a,0) phi[k] = sin(nu[k] * (-a)) * (1.0 / nu[k]); phi[0] = -a; // COS expasion coeff V for Put Vp[k] = (2.0 / (b - a)) * K * (-chi[k] + phi[k]); // Characteristic Function for C, (just different argument inputs) nu[k] = k * M_PI / (b - a); Phi[k] = CharFuncC(nu[k], s0, K, r, q, sigma, t, N); sum += real(Phi[k] * exp(-M_i*(k*M_PI) * a / (b - a)))*Vp[k]; if (k == 0) sum /= 2.0; } v = exp(-r*t)*sum; cout << "strike=" << K << ", price=" << v << endl; sum = 0.0; } } } system("Pause"); return 0; }

  • 2つのvoid関数でmallocを使うと2step目でセグメントエラーが出る

    プログラムのmainを見やすくするためにサブルーチンとしてvoid関数を使っているのですが、その中でmallocでメモリを確保して配列を作ろうとするとエラーが出てしまいます。概略を書くと #include <stdio.h> #include <math.h> #include <stdlib.h> //voidの宣言 void a(double* ,double*, double,); void b(double* ,double*, double,); main(){ double *c,*d,e; double *f,*g,h; c=(double *)malloc(sizeof(double)*N) //Nは適当な整数です d,f,gも同様の処理 色々な作業 while(適当回数繰り返します){ a(c,d,e); b(f,g,h); 色々な作業 } } void a (double* c, double* d, double e){ double **i,*j,; int k; i=(double **)malloc(sizeof(double *)*M) //Mは適当な整数です for(k=0;k<=M;k++){ i[k]=(double *)malloc(sizeof(double)*M) //Mは適当な整数です } jも同様にメモリ確保 様々な作業(逆行列の計算など) } void bはaとほとんど同じです。 mallocで二次元配列や配列を作っています。勿論同じ文字は使っていません。 以上のようなプログラムでgccは通ります。でも実行するとwhile内での1step目は上手くいくのですが、2step目のb内での始めの(double *)malloc(sizeof(double)*L)(Lは適当な整数です)で、つまりメモリ確保でセグメントエラーが出ます。両者とも片方を削るとエラーは出ません。1step目は何故上手くいくのか、2ステップ目で何故ダメなのかが分かりません。皆様の御教授をお願いします。

  • C言語 動的なメモリの確保 実行できない

    malloc関数を使いメモリを確保しそこへ"ABCD"と記憶させ、ポインタ*Cを使い確保したメモリの内容を表示するプログラムです。 ********************************************* #include <stdio.h> #include <stdlib.h> int main(void) {   int i;   char *C;   C = (char *) malloc (sizeof(char) * 5);   C = "ABCD";   for(i = 0; i < 5; i++){     if(C[i] != NULL){       printf("%s", C[i]);    ←※エラー※     }   }   free(C);   return 0; } ********************************************* 正常にコンパイルできますが実行エラーになります。VCを使いF10のデバッグテストで※のところエラーになります。なぜなのでしょうか?

  • ポインタ配列の動的確保

    ポインタの配列の動的確保について教えてください。 入力した数値をポインタ配列に入れるプログラムです。 下記のように書いてみました。(見づらくてごめんなさい) #include<stdio.h> #include<stdlib.h> #define kensu 3 main() { char abc[kensu+1]={'A','B','C','\0'}; char *ptr[kensu]; int i; printf("3つの整数を入力して下さい。\n"); for(i=0;i<kensu;i++){ ptr[i]=(char*)malloc(sizeof(char)*10); if(ptr[i]==NULL){ printf("メモリの取得に失敗しました"); exit(1); } printf("整数%c:",abc[i]); fgets(ptr[i],10,stdin); if(ptr[i][strlen(ptr[i])-1]=='\n') ptr[i][strlen(ptr[i])-1]='\0'; } for(i=0;i<kensu;i++) free(ptr[i]); } ちゃんと動いているようです。 しかし、ポインタ配列の動的確保をネットで調べてみると、ポインタのポインタ(?)を使って、下記のように2度mallocしています。 #include <stdio.h> #include <stdlib.h> #define N 3 int main(void) { char** arr; int i,j; arr = (char**)malloc(N * sizeof(char*)); /* ポインタ配列を確保 */ /* 配列の要素それぞれにつき、メモリ領域を確保 */ for(i=0;i<N;i++) arr[i] = (char*)malloc(N * sizeof(char));   ・・・ ポインタの配列を宣言して、配列の各要素に動的確保するのと ポインタのポインタを宣言し、ポインタ配列を動的確保して、再度配列の要素に動的確保するのとでは、何か違いがあるのでしょうか? ポインタのポインタを宣言し、ポインタ配列を確保する必要性が良く分かっていないのです。 ネット等で調べて見たのですが、理解力がないのかよく分かりませんでした。 どうか教えてください。