我可以访问内存中的任何内容吗?

标签 c pointers memory-management

免责声明:我是 C/C++ 新手。

如果我要manually assign a memory address到 C 中的一个变量,然后尝试回显该值...我是否可以不受限制地访问内存中的任何内容,或者是否存在限制?

例如:

char * p = (char *)0x28ff44;
printf("Memory value: %c", *p);

我猜想如果那个地址的内容不适合 char 类型的大小,那将会严重崩溃,但这只是一个例子。我真正好奇的是,这样的事情是否可行,或者操作系统是否施加了限制,只允许您访问给定内存空间中的内存?

最佳答案

天哪,好吧。

从技术上讲,是的,您可以。在不使用 MMU 或任何形式的保护(或者,你知道,实模式下的 x86)的嵌入式设备中,你可以完全按照你在那里发布的方式进行操作。您也可以在任何操作系统上以用户模式执行此操作,但实际达到有效内存的机会非常小。

实际上,不,您不能只那样做。鉴于虚拟内存和内存保护,您尝试访问的区域很可能不会被映射,因此会失败。此外,如果您访问 protected 内存(例如属于操作系统的任何内容),您的访问将失败。这两种情况都是导致段错误的原因。

您的陈述是有效的(对于不同的有效定义),程序将尝试访问您请求的内存。只是它实际上可能没有映射到任何东西。

还值得注意的是,这就是内存映射 I/O 的工作方式。假设我有一个硬件控制寄存器,写入时会在附加的 UART/串行线上写入一个字节(并且,为简单起见,它就像魔术一样工作,不需要设置任何其他寄存器)。在 C 中,对于我过度简化的设备,这将写成如下:

#define UART1_OUT 0xFC56   

volatile char* uart = UART1_OUT;   // Definition of pointer to variable.
                                   // volatile is required here. Look it up, but
                                   // it basically stops your compiler optimising
                                   // anything to do with this variable

*uart = 'A';                       // Write an A character to the serial line

当然,真实世界的设备要复杂一些;)。

关于我可以访问内存中的任何内容吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12805447/

相关文章:

c++ - 将 operator new 和 operator delete 与自定义内存池/分配器一起使用

c - Heapcrash - 通过增加指向堆的指针来段错误

c++ - gdb - 列出当前函数的源而不输入其名称

c - 为什么第二个数组写的是愚蠢的数字? - C语言

c++ - 尽管缺少空终止符,为什么指向 char 的 C++ 指针仍充当字符串?

c - 如果我想用 C 语言编写数组,如何将其放入函数中?

dll - 释放/删除char *会导致无效的堆指针声明失败

c - 如何使用 netfilter Hook 在内核空间回显数据包?

c - undefined variable 和编译器优化

c++ - 二维数组指针的存储方式是什么?