• ベストアンサー

実行ファイルのメモリ上のアドレスについて

実行ファイルのメモリ上のアドレスを以下の様に 書いて確かめましたがこのやりかたであっていますか? (=exeファイルがメモリ上に読み込まれているアドレス) また、実際にアドレスが表示されるのですが、このアドレスをみて 実際のメモリ本体のどこにロードされているかを理解する 必要はあるでしょうか? カーネルのプログラミングをしているときは必要? int _tmain(int argc, _TCHAR* argv[]) { printf("%p\n",_tmain); return 0; }

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

  • ベストアンサー
回答No.1

アドレスの表示の仕方はあっています。 しかし、ロードされているアドレスを理解する事にあまり意味はないと思われます。 これによって表示されるアドレスは、実アドレスではなく仮想アドレスだからです。 ※他アプリの実行を阻害しないように、プロセスが起動するたびに仮想アドレス空間が用意されます。

ringist
質問者

お礼

回答ありがとうございました。 やはり、理解することには意味がないでしょうね・・ それこそメモリの製造メーカに勤務するとかならない限り、、 後押しされた感じで助かりました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.2

関数名をポインタとしてその値を表示した場合、それがどこのアドレスを指しているのかはOSによって異なります。OSやCPUの種類によっては、関数本体のアドレスではなく関数の情報を格納しているfunction descriptorなどと呼ばれるデータ構造のアドレスが表示される環境もあります。 つまり、質問文にあるようなやり方で分かる場合も分からない場合もあります。 _tmainとかexeファイルという書き方からしてWindowsでしょうかね。

ringist
質問者

お礼

回答ありがとうございました Windows系です ありがとうございますm(__)m

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • _TCHAR*での引数の読み込み

    VC++2010での、通常の #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { return 0; } のウィザードを使って、arvg[1]やargv[2]に引数を与えて、本体内で通常のCで使う printf("%s\n", argv[1]); や fopen(argv[1], "r"); を使いたいのですが、引数の型が_TCHAR*になっているため文字がそのまま使えません。 int main(int argc, char *argv[]) で使えば問題なく使えるのですが、デフォルトのウィザードを使った時の使い方を知っておきたいのです。 御経験のある方、御教示お願い致します。

  • C言語のprintfで桁数をそろえる

    次ので桁数をそろえると書いてあったけどやってみたらできなかった。 コンパイラはMS visual c++バージョンはおそらく7.1.3019 #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { int a; scanf("%d",&a); printf("a=%3d\n",a); return 0; }

  • 解の個数の求め方

    1~500までの数字のうち、3と5で割り切れる数の個数を求める問題で, int _tmain(int argc, _TCHAR* argv[]) { int n=0; for(n=1;n<=500;n=n+1) if((n % 5)==0 && (n % 3)==0) printf("%d\n",n); return 0; } ここまでは出来たのですが、これだと解は出てきますが、個数ではないので、問題の趣旨と違いますよね; どうやればいいのか、だれか教えてくれませんか?

  • argv内容の表示動作

    プログラミング初心者です。 コンソールアプリケーションのプログラミングの練習として、コマンドライン引数を表示することを考えています。書籍等を参考に手元で入力したソースでは、先頭の一文字しか表示されません。例えば、コマンドラインから > test.exe abc def ghi と入力すると、 > argv[0] = t > argv[1] = a > argv[2] = d > argv[3] = g と表示されます。 環境はWindowsXP + VisualStudio2008で、ソースは下のような具合です。 #include "stdafx.h" int _tmain(int argc, _TCHAR *argv[]){ int i; for ( i = 0; i < argc; i++){ printf("argv[%d] = %s\n", i, argv[i]); } return 0; } どの箇所が原因でこのようになってしまうのでしょうか?

  • c++ TCHARで文字化け

    TCHARはUNICODEが扱えるときいたので早速つかってみた。以下は引数を表示するプログラムである。 Visual C++ Express Editionを使った。 #include <stdio.h> #include <tchar.h> int _tmain(int argc, _TCHAR* argv[]) { int i=0; while(i<argc){ _tprintf(_T("%s\r\n"),argv[i++]); } return 0; } しかし上記プログラムに日本語の引数をわたすと文字化けするではないか。なでしょうか?

  • 文字配列から数値への変換

    MicrosoftのVisual-Studio 2005を使っています。 C/C++については、ほぼ素人で、困っています。 下記のような簡単なソースで、 456 012 678 を表示するようにしたいのですが、できなくて困っています。 最初の 123 789 345 は下記のソースで表記できたのですが、どうすればよいの でしょう? 数値をわざと文字列で読み込んで、これを 数値に変換しているのでややこしいのかもしれませんが、 できればこれでやりたいので、申し訳ありませんが、教えていただ けないのでしょうか。よろしくお願いします。 #include "stdafx.h" #include "stdlib.h" char str[3][200] = { "123 456", "789 012", "345 678" }; int _tmain(int argc, _TCHAR* argv[]) { int a[10]; for (argc = 0; argc < 3; argc++){ a[argc] = atof(str[argc]); printf("%d\n", a[argc]); }; return 0; }

  • c言語の関数で

    初歩的な質問ですみません。 学校で住所、電話番号などを表示する関数を作っているのですが、 #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { void county(void); void address(void); void phone(void); void main(void) { county(); address(); phone(); return(0); } void county(void) { printf("A県B市"); } void address(void) { printf("Cハイツ105"); } phone(void) { printf("000-000-0000"); } } 上の文でビルドするとエラーを起こしてしまいます。どこが間違っているのでしょうか?

  • ポインタのアドレスについて

    こんばんわ。 以下のようなchar型の配列を直接Fooにキャストして利用したいのですが、 Foo構造体のdataにはint型の配列として利用したいのですが可能でしょうか? char型の配列を直接Fooにキャストした後にdataの部分を操作すれば 可能かと思っていたのですがうまくいきません。 foo->data=new int*[2]; としてしまうとbytData[8]が破壊されてしまいます。 このような方法は無理でしょうか? struct Foo {    int   tenmp ;    int   count ;    int**  data ; } ; char bytData[ 4 + 4 + 8 ] = { 1, 0, 0, 0,                 2, 0, 0, 0,                 3, 0, 0, 0,                 4, 0, 0, 0, } ; int _tmain(int argc, _TCHAR* argv[]) {    Foo* foo ;    foo = reinterpret_cast< Foo* >( bytData ) ;    foo->data = (int**)&bytData[ 8 ] ; // ここがダメ。    printf( "%d\n", *foo->data[ 0 ] ) ; // 3    printf( "%d\n", *foo->data[ 1 ] ) ; // 4    return 0 ; }

  • 10個で改行したいのですが

    int _tmain(int argc, _TCHAR* argv[]) { int i,n,j,w,m,; printf("素数は\n"); n=0; for(i=1; i<=2000; i++){ n=n+i; w=0; for(j=1; j<=i ;j++){ m=i%j; if(m==0){ w=w+1; } } if(w==2){ printf("%d、",i); } } return 0; } このプログラムは2000までの素数を出力するプログラムです。この結果の素数10個ずつで改行したいのですが、どうすればよいでしょうか? お願いします。

  • 関数に配列を渡した場合にサイズが

    C言語初心者です。 以下のように関数に配列を渡した場合、サイズが変わってしまうのは何故でしょうか。 #include "stdafx.h" void fanc(char [3]); int _tmain(int argc, _TCHAR* argv[]) { char a[] = {'a','b','c'}; printf("%d\n",sizeof(a)); // aのサイズ 3 fanc(a); return 0; } void fanc(char b[]){ printf("%d\n",sizeof(b)); // bのサイズ 4 }