【发布时间】:2017-08-18 16:21:38
【问题描述】:
假设我有一个错误的指针,我递增它以查看下一个内存位置中的内容。我的代码运行良好,没有任何错误或问题。我只是打印出这些内存位置的内容。我在屏幕上看到了输出,其中一些内存位置的值为 0,其他内存位置包含一些似乎以模式排列的大负数或正数。但是,如果我尝试更改或覆盖这些内存位置的内容怎么办?它们代表什么?什么样的数据可能存储在这些内存位置,如果这些内存位置有足够多的改变,是否可能破坏操作系统?
#include <iostream>
using std::cout;
using std::endl;
int main() {
int num1 = 5;
int* bad_ptr = &num1;
cout << "Address of num1: " << &num1 << endl;
cout << "Dereference bad pointer: " << *bad_ptr << endl;
// The bad pointer acesses 500 memory addresses
for (int i = 0; i < 500; i++) {
bad_ptr++;
cout << "Dereference bad pointer: " << *bad_ptr << endl;
// What if I try to change it?
// *bad_ptr = 1;
}
return 0;
}
【问题讨论】:
-
未定义的行为是未定义的。您可以弄清楚您的特定编译器版本在特定时间对特定操作系统版本的特定优化级别和标志做了什么,但您可能不会学到任何有意义的东西。
-
“如果足够多的这些内存位置被更改,是否有可能破坏操作系统”取决于操作系统、程序类型和硬件架构。现代 CPU 具有防止一个进程损坏其他进程的保护措施,您的操作系统可能会利用这一点。但是,在内核驱动程序中执行此操作可能会导致错误。在具有更简单的内存管理模型的微控制器中执行此操作,该模型不会将操作系统与应用程序隔离,是的,操作系统可能会被踩踏。
-
编译器假定未定义的行为永远不会在有效程序中发生。因此它可以优化包含 ub 的部分远离程序。或者它可能不会,或者它可能会打印一个零(这可能不是实际存储在内存位置的内容)或任何其他感觉的值
-
FWIW 回到旧的 MSDOS 时代,写入不属于您的内存可能会导致系统重新启动。
-
@PaulMcKenzie 在某些微控制器上,您可以覆盖 CPU 时钟倍频器并使其过热并着火
标签: c++ pointers memory shared-memory