如何在C中获取地址?

时间:2009-08-03 00:45:15

标签: c pointers memory-address

这可能是一个非常简单的答案,但我看不到它。

#include <stdio.h>

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

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

6 个答案:

答案 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