关于C语言指针读取内存地址的问题,高手请进

来源:百度知道 编辑:UC知道 时间:2024/06/14 16:30:34
在内存中给每一个存活的变量一个足够大的空间来存储其值,于是该块空间的地址理应成为一个唯一值,列如已知一个int型变量num在内存中的地址为0012FF60,该变量的值为10。
可为什么用利用指针读出来的值却不是10呢?

详解:我一共创建了2个工程,第一个工程:
#include <stdio.h>

int main(void)
{
int num=10;

printf("%d \t %p",num,&num);
getchar();
return 0;
}

然后我到debug下运行了该项目的exe文件。得到CMD窗口,内容如下
10 0012FF60(光标闪烁处)

这时num这个变量应该是在内存中存活的。
我又运行了第二个项目
#include <stdio.h>

int main()
{
int *p;
p=0x0012FF60; //指向num变量的地址

printf("%d",*p);
}
得到的结果却不是10。是一个随即的数字。请高手帮我。
补充一下,看了下面几位的回答的确感到惭愧。那么有没有什么办法可以访问到它

windows有个api ReadProcessMemory 用这个可以访问其它进程的内存地址

被操作系统忽悠了...

你要是在没有操作系统, 而且缓存足够小的平台上运行, 就可以得到你想要的值.

建议你补充下你应用的操作系统

如果是Windows, 你可以考虑在第二个进程中用OpenProcess先打开第一个进程. 然后就可以用ReadProcessMemory和WriteProcessMemory对第一个进程的内存进行读写

....去看看进程间通信吧.每个进程都有独立的地址空间,不是说访问就访问的,没有权限..要是这么容易的话QQ密码就不那么难得到了..

楼主这个idear应该说很不错,我也去试验了,用TC实验的,结果一样。
自己也不太解,估计是每一个进程都分配了自己的堆栈空间,所以0012FF60访问的并不和前一进程的0012FF60是同一物理地址。

其实对于main主函数来说,它也是一个被调函数,只不过调用它的是系统而已。楼主肯定知道在C中被调函数结束后,其定义的所有变量所占的内存是被释放的,所以再想运行另一段程序用指针指向该地址,不可能得到你所认为应该存在的值的

因为0x0012FF60实际是指向一个临时的缓冲区,通常是堆栈.
通常这个值只在程序运行时有效.

你的这个问题实际并不是一个问题, 而是对程序运行方式的理解还不够透彻.
如果你实在想搞清楚,建议参考一些汇编的书籍.