これにはおそらく本当に簡単な答えがありますが、私にはそれがわかりません。
#include <stdio.h>
int main(void) {
int x = 0;
printf("\n%d\n%d\n",x,&x);
}
さて、printf は 0 (x) と 2293752 (&x) を返します。任意のアドレス (&) を見て、そこに既に格納されているものを確認する方法を見つけようとしています。これは実験用です。何か助けはありますか?
これにはおそらく本当に簡単な答えがありますが、私にはそれがわかりません。
#include <stdio.h>
int main(void) {
int x = 0;
printf("\n%d\n%d\n",x,&x);
}
さて、printf は 0 (x) と 2293752 (&x) を返します。任意のアドレス (&) を見て、そこに既に格納されているものを確認する方法を見つけようとしています。これは実験用です。何か助けはありますか?
void* memAddr = (void*)0xAABBCCDD; //put your memory address here
printf("int value at memory address %p is %i", memAddr, *((int*)memAddr));
任意のメモリアドレスを調べると、クラッシュが発生する可能性があります。
これを行おうとすると多くの問題が発生します。何よりもまず、ウィルソンが述べたように、そこに何が格納されているのかまったくわからないということです。
Wilsonは少しずれていますが、intではなくcharにキャストする必要があります。これは、intの場合、charの場合のように1バイトではなく4バイトが表示されるためです。
さらに、8ビットASCII文字を読み取って頭の中で意味のあるものにマップできない限り、base2、base8、base16などの他の形式に変換することをお勧めします。
これはいくつかの方法で行うことができます。おそらくこれを行うための最良の方法は、ビット単位の演算子とバイナリシフト演算子を使用して、ディスパッチテーブルを調べて表示可能なASCIIにマップすることです。
ただし、そこに何が格納されているかはまだわかりません。エンコードされた形式の生のバイナリデータを見ることができます。その理由は、Cはそのメモリアドレスを指す変数に関してのみ入力されるためです。そのメモリを裸で見ると、バイナリが表示され、メモリがバインドされている変数やそれらの変数のタイプを検索することはできません。
2番目の問題は、アクセスできるメモリの一部のみを調べるように注意する必要があることです。アクセス方法に注意しない限り、メモリのコードセグメントを調べることはできません。セグメンテーション違反を回避するために突っ込んだ場合は幸運です。
ただし、プロセスのメモリを調べる最も効果的な方法は、そのセグメントをディスクにダンプすることです。UNIXでは、これはコアダンプを介して行われます。次に、デバッガーに対してロードして、心のコンテンツを調べたり、スタックに関する十分な知識があれば、正しいタイプにマップしたりすることもできます。バイナリエディタを使用して、型指定されていない方法でそれを調べることもできます。多くの場合、文字列は認識可能です。
幸運を!
これは、* 演算子であるポインター逆参照です。ただし、格納されたデータのタイプがランダム アドレスに対して何であるかを知る方法はありません。
#include <stdio.h>
int main(void) {
int x = 0;
printf("\n%d\n%d\n%d\n",x,&x,*(&x));
}
/* resulting output will be 0, some memory address, and 0 again */
メモリを調べたい場合は、OllyDbgなどの低レベルのデバッガを使用することをお勧めします。
%pを使用してアドレスを確認できます
printf("%p",&x);
ポインタについて読み始めることをお勧めします。ポインタはメモリアドレスを格納する変数です。
int x=10;
int *p; //this is a pointer to int
p=&x; //now p has the memory location of x
printf("%d\n",*p); //this will print 10
「生の」データを調べたいと仮定し、プロセスのアドレス空間内のアドレスを知っていると仮定すると、次のようになります。
long x=<address>
printf("%x", *(int *)x);