【发布时间】:2022-01-19 17:49:44
【问题描述】:
我正在尝试访问内存中的某个位置并检索该内存位置的内容,但是当我运行该程序时,它似乎无法运行。我没有收到任何错误,它只是一个空白的控制台屏幕。我首先想到的是,能够访问这样的内存位置可能会导致安全漏洞。是这个原因还是我的代码错了?
int main()
{
int * pointer = 100;
printf("%d", *pointer);
return 0;
}
【问题讨论】:
-
访问任意内存地址是 C 中未定义的行为。您的程序可能已经崩溃。
-
这是未定义的行为,因为没有理由认为您的进程地址空间的地址
100(0x64) 映射到任何东西。它在任何分配的内存分段之外,所以我每次都会遇到分段错误。这实际上不是 C 的事情(C 不关心这样的事情),但是你的内核会遇到问题。在可以直接访问内存(没有虚拟内存)的微控制器上,这实际上可以正常工作。 -
这可能是内核内存位置,在用户模式下无法读取。
-
上面的cmets是正确的,但是在某些情况下你可以任意访问内存位置。这就是内核通过将信息存储在特定地址来将文本打印到屏幕的方式,但您不是内核,操作系统可能会阻止您这样做。
-
如果你想分析你的进程virtual address space的内存布局,你将不得不使用平台特定的函数。因此,如果您希望我们告诉您如何做到这一点,请指定您使用的平台(即操作系统)。