dポイントプレゼントキャンペーン実施中!

C言語において、あるアドレスを指定して、その中に入っている値を表示する方法は
どのようにすればよいでしょうか。
これに関しては
http://oshiete1.goo.ne.jp/kotaeru.php3?q=377367
にありましたので、試してみましたが、

ptr = (unsigned char *)add ;の部分でセグメンテーションエラーになってしまいました。

A 回答 (3件)

>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-virt …

Windowsならこっち
http://homepage2.nifty.com/DSS/WinSys/Win/DevAdd …

他にも「物理アドレス 参照」などで調べると良いかもしれません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/10/13 13:22

あなたにアクセスする権限がないアドレスを参照することは、


OSによって禁止されています。
#1の補足に書かれたアドレスには意味があるのですか?
一般的には、そのように直接アドレスを指定することは有り得ません。

単純にこういう使い方は、(意味は兎も角)ありですが。
#include <stdio.h>
int main(int argc, char ** argv)
{
char * p = argv[0];
printf("%p:%c\n", p, * p);
return 0;
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/10/13 13:24

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

この回答への補足

早速有難うございます。環境は、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;
}

補足日時:2006/10/12 16:39
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!