• ベストアンサー

アドレスの中身を参照する方法

C言語において、あるアドレスを指定して、その中に入っている値を表示する方法は どのようにすればよいでしょうか。 これに関しては http://oshiete1.goo.ne.jp/kotaeru.php3?q=377367 にありましたので、試してみましたが、 ptr = (unsigned char *)add ;の部分でセグメンテーションエラーになってしまいました。

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

  • ベストアンサー
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.2

>add=0xad736; >ptr=(unsigned char *)add; >printf( "%lx",*ptr); 一昔前のOSなら、そういう事も可能だったのかもしれませんが 今のOSでは出来ません。 基本的に現在のOS(Fedoraを含むLinuxやWindows)では アプリケーションが参照するメモリアドレスは 仮想メモリ空間のアドレスであって、実アドレスではないのです。 つまり0xad736というのはOSがそのアプリケーションに割り振った値では無いので 無効なアドレスというわけです。 実際試してはいませんが、Linux(Fedora)の物理メモリアドレス参照は 以下のページが参考になるかもしれません。 http://www-online.kek.jp/~yasu/Kenshu/linux-virtual-address.html Windowsならこっち http://homepage2.nifty.com/DSS/WinSys/Win/DevAddress.htm 他にも「物理アドレス 参照」などで調べると良いかもしれません。

maiko100
質問者

お礼

有り難うございました。仮想メモリ空間のアドレスでしたか。 H8マイコンでのアドレス設定の方法を読んで、パソコンで試してみようと思ったのでした。 大変よくわかりました。

その他の回答 (2)

回答No.3

あなたにアクセスする権限がないアドレスを参照することは、 OSによって禁止されています。 #1の補足に書かれたアドレスには意味があるのですか? 一般的には、そのように直接アドレスを指定することは有り得ません。 単純にこういう使い方は、(意味は兎も角)ありですが。 #include <stdio.h> int main(int argc, char ** argv) { char * p = argv[0]; printf("%p:%c\n", p, * p); return 0; }

maiko100
質問者

お礼

>#1の補足に書かれたアドレスには意味があるのですか 適当な変数を格納した時のアドレスを表示させてところ、この値が出たので、この逆はできないかなぁと思ったのです。 >OSによって禁止されています。 有り難うございました

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

環境もわからないしどのようなプログラムかもわからないんですが, そこでセグメンテーションエラーが出るとは思えないなぁ.

maiko100
質問者

補足

早速有難うございます。環境は、Fedora5でソースは下記のとおりです。如何でしょうか? #include <stdio.h> int main( void ) { unsigned char *ptr; unsigned long int add; add=0xad736; // scanf("%lx",&add); ptr=(unsigned char *)add; printf( "%lx",*ptr); return 0; }