C语言中任意内存位置的解引用
我正在调试我写的一个程序。根据调试器,特定的C语言中任意内存位置的解引用,c,memory,pointers,dereference,C,Memory,Pointers,Dereference,我正在调试我写的一个程序。根据调试器,特定的void*保存值0x804b008。我希望能够取消引用该值(将其转换为int*并获取其值) 这段代码有一个分段错误。(带有void*的程序仍在后台运行,顺便说一句,它已“暂停”) #包括 int main(){ int*pVal=(int*)0x804b008; printf(“%d”,*pVal); } 我明白为什么能够尊重记忆中的任何一点都是危险的,所以这可能就是为什么这不起作用 谢谢大家! 您的程序(在调试器中运行)和此程序将不会在相同的虚拟内
void*
保存值0x804b008。我希望能够取消引用该值(将其转换为int*
并获取其值)
这段代码有一个分段错误。(带有void*
的程序仍在后台运行,顺便说一句,它已“暂停”)
#包括
int main(){
int*pVal=(int*)0x804b008;
printf(“%d”,*pVal);
}
我明白为什么能够尊重记忆中的任何一点都是危险的,所以这可能就是为什么这不起作用
谢谢大家! 您的程序(在调试器中运行)和此程序将不会在相同的虚拟内存空间中运行;访问该指针(即使它是有效的指针)不会提供任何信息
机器上运行的每个程序都有自己的逻辑地址空间。您的操作系统、编程语言运行时和其他因素可能会影响您看到的用作任何给定程序指针的实际文字值。但是一个程序肯定看不到另一个程序的内存空间,当然软件调试器除外,软件调试器做了一些特殊的技巧来支持这种行为
在任何情况下,调试器都应该允许您在程序暂停时查看所需的内存—假设您有一个有效地址。在gdbx/x0x804B008
中,您将看到您想要看到的内容
有关更多信息:
这很简单。操作系统知道该地址不属于您的程序,因此如果不绕过内存保护,就无法打印该地址。我读了一些有关操作系统开发的内容,因此我相信我有点理解您所说的内容。这个虚拟内存是否位于RAM中?只是映射到不同的寻址方案还是其他什么?再次感谢。编辑:在我问之前就回答了我的问题!虚拟内存仅仅意味着在编写程序时,您有一个很好的连续内存空间。操作系统为您处理所有可能的内存碎片。谢谢。我收集了很多。我更感兴趣的是它是如何在操作系统级别实现的。似乎就是这样做的。谢谢你怎么了?它打印0:但是为什么呢?它应该有一个分段错误。不是吗@CarlNorum@MukitChowdhury,未定义的行为是未定义的。这意味着即使是正确操作的外观也是可能的。
#include <stdio.h>
int main() {
int* pVal = (int *)0x804b008;
printf("%d", *pVal);
}