这是我写的覆盖RAM数据并最终导致操作系统崩溃的代码。

#include<stdio.h>
#include<conio.h>
int main(){
    int i=10;
    int *j;
    j=&i;
    int m=0;
    while(true){
        *(j+m)=m*m; //next location of i
        printf("New Value is. %d \n",(m));
        m++;
    }
    printf("Complete");
    getch();
    return 0;
}

但是在m是46之后,我的程序就崩溃了(m的值可能不同于编译器)。
为什么这个程序会有这样的行为?是不是因为我们的操作系统提供了一些固定的内存空间来加载和运行一个程序,而超出内存限制会导致程序崩溃?

最佳答案

您将覆盖堆栈,从局部变量中销毁数据,并从当前函数的过程指针通过之前调用的所有其他函数返回,直到到达内存的某个只读部分,因为它包含程序的实际代码,并且该部分受到保护。当您试图覆盖它时,系统将阻止它,应用程序将崩溃,出现类似这样的“内存无法写入”错误。
不确定Linux,但在Windows中,您可以使用VirtualProtect()来证明内存不正确。但这样做只会使它在路上崩溃一点,因为您用垃圾覆盖循环代码,并死于分段错误。
但是,您仍然无法访问计算机的实际RAM,甚至无法知道实际RAM中的实际地址。当你是操作系统下的一个进程时,你就在虚拟内存领域,在那里操作系统将保证你不能直接与系统或其他进程的内存交互,而不是不通过系统提供给你的通道。

关于c - 为什么该指针程序未覆盖所有RAM存储器位置?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43262839/

10-13 08:06
查看更多