【发布时间】:2015-01-08 07:42:54
【问题描述】:
我正在尝试扫描系统的内存。
我的计划: 创建指向内存的指针, 并在每个循环中将此指针向上移动一个字节。
所以这就是我想出的:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
const char *MemAdressPointer(int n);
int main(void) {
int i = 0;
for(i = 0; i<100; i++)
{
const char* pAddr = MemAdressPointer(i+5000);
printf("%c hexadecimal value of : 0x%p with i at : %i\n", *pAddr, pAddr, i);
}
getchar();
return 0;
}
const char *MemAdressPointer(int n)
{
void *p1 = (void*) n;
const char* p2;
p2 = p1;
return p2;
}
至少我所知道的一切都有效。
打印好的内存地址。
但是当我打印字符 (%c) 时它会停止响应
很奇怪,指针,是一个字符,
不应该是指向一个字节,然后得到这个字节的二进制值
并从中取出对应的字符。
感谢您能给我的任何帮助。
【问题讨论】:
-
所以您只需访问内存地址 5000 到
5000+100*sizeof(int)并期望它可以正常运行吗?好吧,祝你好运。大多数情况下,您将在程序执行期间的某个时刻执行非法内存访问(尽管您只是在读取,而不是在写入,但它看起来仍然很不安全)。无论如何,作为对您问题的正式回答 - 您的代码会产生未定义的行为(非法内存访问是实际的答案)。 -
顺便说一下,如果您在虚拟内存地址空间上运行,那么您的程序将测试虚拟地址,而不是物理地址。换句话说,您将在从操作系统加载进程的基地址的偏移量处读取(每次运行程序时,甚至每次操作系统将其换入和换出内存时都可能不同)。
-
那里的
5000+100*sizeof(int)出错了。应该只是 5099(包括)。评论的其余部分维持......