gpt4 book ai didi

c - 为什么这个指针程序没有覆盖所有 RAM 内存位置?

转载 作者:太空宇宙 更新时间:2023-11-04 05:23:47 27 4
gpt4 key购买 nike

这是我编写的用于覆盖 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 的值可能因编译器而异)。为什么这个程序会以这种方式运行?是不是因为我们的操作系统提供了一些固定的内存空间来加载和运行程序,超出内存限制会导致程序崩溃?

最佳答案

你正在覆盖堆栈,破坏局部变量的数据,并从你当前函数的过程指针返回到它之前调用的所有其他函数,直到你到达只读的内存部分,因为它包含实际代码你的程序,这部分是 protected 。当您也尝试覆盖它时,系统将阻止它并且应用程序将崩溃并出现类似“无法写入内存”的错误。

不确定 Linux,但在 Windows 中,您可以使用 VirtualProtect() 取消保护此内存。但是这样做只会让它在路上崩溃一点,因为你用垃圾覆盖循环代码并死于段错误。

但是,您仍然无法访问计算机的实际 RAM,您甚至无法知道您所在的实际 RAM 中的实际地址。当您是操作系统下的进程时,您处于虚拟内存领域,操作系统将保证您不能直接干预系统或其他进程的内存,除非通过系统为您提供的 channel 。

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com