3

对此可能有一个非常简单的答案,但我就是看不到。

#include <stdio.h>

int main(void) {
int x = 0;
printf("\n%d\n%d\n",x,&x);
}

好的,所以 printf 给出了 0 (x) 和 2293752 (&x)。我试图找出一种方法来查看任何地址(&)并查看那里已经存储了什么。这只是为了实验。有什么帮助吗?

4

6 回答 6

4
void* memAddr = (void*)0xAABBCCDD; //put your memory address here
printf("int value at memory address %p is %i", memAddr, *((int*)memAddr));

您可能会发现检查任意内存地址只会导致崩溃。

于 2009-08-03T00:56:48.323 回答
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 */
于 2009-08-03T00:48:15.783 回答
2

尝试这样做有很多问题,首先,正如威尔逊所提到的,你真的不知道那里存储了什么。

不过,Wilson 有点偏离,您确实应该将其转换为 char 而不是 int,因为使用 int 您会看到 4 个字节,而不是像使用 char 时看到的单个字节。

此外,除非您可以读取 8 位 ASCII 字符并将它们映射到您脑海中有意义的内容,否则您可能希望将其转换为其他形式,例如 base2、base8 或 base16。

您可以通过多种方式执行此操作 - 可能最好的方法是使用按位运算符和二进制移位运算符,查找调度表以将其映射为可查看的 ASCII。

但是,您仍然不知道它在那里存储了什么,您只能看到原始二进制数据的某种编码形式。原因是 C 仅针对指向该内存地址的变量进行类型化。对该内存的裸视图只会为您提供二进制文件,而无法查看内存绑定到哪些变量或这些变量是什么类型。

第二个问题是您需要小心只查看您可以访问的部分内存。除非您小心访问它的方式,否则无法查看内存的代码段。如果您四处寻找以避免分段错误,您将很幸运。

不过,查看进程内存的最有效方法可能是将其段转储到磁盘。在 UNIX 中,这是通过核心转储完成的。然后,您可以将其加载到调试器中并查看您的内心内容,甚至能够将其映射到具有足够堆栈知识的正确类型。您还可以使用二进制编辑器以无类型的方式检查它 - 通常字符串是可识别的。

祝你好运!

于 2009-08-03T01:00:15.483 回答
1

如果您想探索内存,我建议您使用低级调试器,例如OllyDbg

于 2009-08-03T00:59:41.800 回答
0

假设您想查看“原始”数据并且您知道进程地址空间内的地址,您可以这样做:

long x=<address>
printf("%x", *(int *)x);
于 2009-08-03T00:51:09.153 回答
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
于 2009-08-03T01:01:52.487 回答