【发布时间】:2021-04-27 04:25:06
【问题描述】:
所以当我了解指针时,我有了一个疯狂的想法: 如果我打印一个指针,它会给出内存中的地址,如果是这样,实际读取的是计算机内存的哪一部分?例如
#include <iostream>
using namespace std;
main()
{
int a=1;
int* ptr=&a;
int i=0;
while(1)
{
cout<<(ptr+i)<<"\t"<<*(ptr+i)<<"\n";
i++;
}
}
当我运行这个程序时(考虑到没有错误),它给了我来自&a++ 的地址。所以它会遍历内存中的地址,并显示存储在那里的信息。所以我的问题是,正在读取内存的哪一部分?我是否可以访问每个内存位置(存储在每个内存位置的值)?我可以像这样删除(这听起来很愚蠢)我电脑上的文件吗?
ptr=nullptr;
while(1)
{
*(ptr+i)=0;
i++;
}
我不知道我的语法是否正确,尽管你明白了。我不敢在我的电脑上运行这个......
【问题讨论】:
-
您不能访问不属于您的内存。在指针不再指向它所指向的对象/数组后,您也不能访问它。这段代码所做的任何事情都是未定义的行为。
-
这取决于您的系统。在没有内存保护的古老或嵌入式系统上,这样做确实可能会覆盖其他程序或操作系统的一部分(通常不是文件,因为它们将在磁盘上而不是在内存中,尽管缓存在内存中的文件可能会损坏)。在现代台式机或服务器系统上,硬件内存保护不允许这种情况发生。
-
@NateEldredge:桌面操作系统可能会阻止程序访问进程不拥有的存储,但进程通常会拥有超出 C 或 C++ 语言构造可用于 C 或C++ 程序和实现通常不会捕获对此类存储的访问。
-
取决于操作系统和硬件。在许多嵌入式系统上,访问未定义的地址没有问题。其他平台有硬件“围栏”以防止区域被访问。当您访问程序空间之外的地址时,某些操作系统可能会产生故障。它们是否产生异常再次取决于您的系统;没有通知要求。
标签: c++ pointers memory-management