这可能是一个非常简单的答案,但我看不到它。
#include <stdio.h>
int main(void) {
int x = 0;
printf("\n%d\n%d\n",x,&x);
}
好的,所以printf给出0(x)和2293752(&amp; x)。我试图找出一种方法来查看任何地址(&amp;)并查看已存储的内容。这只是为了实验。有什么帮助吗?
答案 0 :(得分:4)
void* memAddr = (void*)0xAABBCCDD; //put your memory address here
printf("int value at memory address %p is %i", memAddr, *((int*)memAddr));
您可能会发现检查任意内存地址只会导致崩溃。
答案 1 :(得分:2)
那将是指针解除引用,它是*运算符。但是,您无法确定存储数据的类型是针对随机地址的。
#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 */
答案 2 :(得分:2)
尝试这样做有很多问题,首先,正如威尔逊所提到的,你真的不知道那里存储了什么。
但是,威尔逊略有偏离,你真的应该将它转换为char而不是int,就像使用int一样,你会看到4个字节而不是单个字节,就像使用char一样。此外,除非您可以阅读8位ASCII字符并将其映射到您脑中有意义的内容,否则您可能希望将其转换为其他形式,例如base2,base8或base16。
您可以通过多种方式执行此操作 - 可能最好的方法是使用按位运算符和二进制移位运算符,查找调度表以将其映射到可查看的ASCII。
但是,您仍然不知道它存储在那里的内容,您将能够看到原始二进制数据的某些编码形式。原因是C仅针对指向该内存地址的变量进行类型化。对该内存的裸视图只会给你二进制,无法查找内存绑定的变量或这些变量的类型。
第二个问题是您需要注意只查看您有权访问的内存部分。除非您小心访问它,否则无法查看内存的代码段。如果您四处寻找以避免分段错误,那将是您的幸运。
但是,查看进程内存的最有效方法可能是将其段转储到磁盘。在UNIX中,这是通过核心转储完成的。然后,您可以将其加载到调试器上并浏览您的内容,甚至可以将其映射到具有足够堆栈知识的正确类型。您还可以使用二进制编辑器以无类型方式检查它 - 通常字符串是可识别的。 祝你好运!答案 3 :(得分:1)
如果你想探索内存,我建议使用低级调试器,例如OllyDbg。
答案 4 :(得分:0)
假设您要查看“原始”数据,并且您知道流程地址空间内的地址,则可以执行以下操作:
long x=<address>
printf("%x", *(int *)x);
答案 5 :(得分:0)
查看您可以使用的地址%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