C++ 为什么可以';我得不到存储单元n中的内容?

C++ 为什么可以';我得不到存储单元n中的内容?,c++,pointers,memory,C++,Pointers,Memory,我试图找到地址32的对象。所以,我写了这段代码: char *cp = (char *)32; cout<<*cp<<endl; char*cp=(char*)32; cout正如问题中提到的,c/c++中的内存访问并不是蛮荒的西部,除非您使用的是一些自定义操作系统/硬件,允许您做这些事情(您知道:),否则不应该尝试 访问以前未分配的任何地址都可能导致程序崩溃 p>所以如果你想得到一堆堆,你可以访问的最小地址,例如在C++中(也可以): #包括 使用名称空间std;

我试图找到地址32的对象。所以,我写了这段代码:

char *cp = (char *)32;
cout<<*cp<<endl;
char*cp=(char*)32;
cout正如问题中提到的,c/c++中的内存访问并不是蛮荒的西部,除非您使用的是一些自定义操作系统/硬件,允许您做这些事情(您知道:),否则不应该尝试

访问以前未分配的任何地址都可能导致程序崩溃

<> p>所以如果你想得到一堆堆,你可以访问的最小地址,例如在C++中(也可以):

#包括
使用名称空间std;
int main(){
int*myC=new int();//现在我要求操作系统给我一些堆空间来存储int
*myC=123;//给它赋值
cout正如问题中提到的,c/c++中的内存访问并不是蛮荒的西部,除非您使用的是一些自定义操作系统/硬件,允许您做这些事情(您知道:),否则不应该尝试

访问以前未分配的任何地址都可能导致程序崩溃

<> p>所以如果你想得到一堆堆,你可以访问的最小地址,例如在C++中(也可以):

#包括
使用名称空间std;
int main(){
int*myC=new int();//现在我要求操作系统给我一些堆空间来存储int
*myC=123;//给它赋值

cout通常保护第一个内存页以捕获空访问错误


希望您这样做是出于好奇,而不是在生产软件中。您可以使用Windows上的结构化异常处理或Linux上的信号处理访问冲突。

第一个内存页通常受到保护,以捕获空访问错误


希望您这样做是出于好奇,而不是在生产软件中。您可以使用Windows上的结构化异常处理或Linux上的信号来处理访问冲突。

有很多方法可以思考您为什么会看到这种行为

<> P>从语言的角度来看,C++标准表示,如果访问任何与一个对象不对应的内存,则导致程序有未定义的行为。这意味着C++对可能发生的事情绝对没有限制。您可能能够读取或写入内存,但也可能立即崩溃程序。例如,在嵌入式设备中,它可能会点燃计算机!因此,您的问题的一个答案是“您访问了与对象不对应的内存,因此结果未定义,而在您的计算机上,它碰巧使程序崩溃。”

从机器的角度来看,C++的大多数实现都将解释你的代码为“创建一个指向字节32的指针,然后尝试去引用它”。在大多数操作系统中,OS和程序被设置成为程序分配内存到不同的段(代码、文本、堆栈、堆等)。操作系统会终止任何试图读取这些段之外内存的程序。原因通常与虚拟内存有关。当程序运行时,操作系统会为程序设置一个虚拟地址空间,并提供从虚拟地址(程序看到的)到物理地址的映射(RAM中实际包含的内容)。每当您尝试访问内存时,操作系统都会将您的查找从虚拟地址重新映射到某个物理地址。如果程序尝试读取或写入一个不属于操作系统映射的内存地址,则操作系统无法分配该读取或写入的物理内存位置,因此它会终止程序,以避免输入垃圾值或clobb其他的记忆

也就是说,在较旧的操作系统或嵌入式设备上,您完全可以读取或写入任意内存位置。例如,如果您正在编程微控制器,则某些固定内存地址可能对应于物理设备(灯、端口等)因此,通常将这些设备的地址键入指针,然后读取或写入指针。在没有虚拟内存的旧系统上,尝试读取或写入垃圾内存的程序可能会破坏其他进程的内存,导致整个系统崩溃或导致严重的安全漏洞

我不相信Windows中有读取物理内存的机制,因为这是一个主要的安全风险(想象一下,当您键入密码时,病毒可能会从浏览器读取进程内存!)我相信,您可以使用一些函数来读取和写入进程内存,尽管系统安全管理器可能会阻止它们在可能导致安全问题的情况下工作


希望这能有所帮助!

有很多方法可以思考你为什么会看到这种行为

<> P>从语言的角度来看,C++标准表示,如果访问任何与一个对象不对应的内存,则导致程序有未定义的行为。这意味着C++对可能发生的事情绝对没有限制。您可能能够读取或写入内存,但也可能立即崩溃程序。例如,在嵌入式设备中,它可能会点燃计算机!因此,您的问题的一个答案是“您访问了与对象不对应的内存,因此结果未定义,而在您的计算机上,它碰巧使程序崩溃。”

从机器的角度来看,C++的大多数实现都将解释你的代码为“创建一个指向字节32的指针,然后尝试去引用它”。在大多数操作系统中,OS和程序被设置成为程序分配内存到不同的段(代码、文本、堆栈、堆等)。操作系统会终止任何试图读取这些段之外内存的程序。原因通常与虚拟内存有关。当程序运行时,操作系统会为程序设置一个虚拟地址空间,并从虚拟内存映射

#include <iostream>
using namespace std;

int main() {
    int *myC = new int(); // now I ask the OS to give me some heap space to store an int
    *myC = 123; // assign a value to it
    cout<< "Content "<< *myC << endl; // this will print 123
    cout<< "Adress "<< myC << endl;  // this will print the actual address that the OS gave for this variable 
    delete myC; // after you've used the memory allocated you have to release the memory
    return 0;
}