#include <iostream>
int main()
{
int* i = 0;
int x = (*i);
std::cout << x;
}
当我使用Visual Studio 2010
编译并运行它时,上面的程序会崩溃,我知道它崩溃了,因为我将指针设置为0。
我想知道的是,正在访问标准中定义的C ++中的null pointer
,还是未定义的,我很幸运,因为我的编译器/计算机/操作系统,我的程序崩溃了
如果定义了,当我尝试访问空指针时C ++会保证什么?
答案 0 :(得分:9)
取消引用空指针将调用未定义的行为。它可能会在不同的编译器上产生不同的东西,甚至更多 - 如果多次编译,同一编译器可能会发生不同的事情。根本不保证这种行为。
答案 1 :(得分:2)
使您的进程崩溃的原因是操作系统阻止您的程序摆弄它无法访问的内存(在地址0)。 Windows会给你一个“访问冲突”,Linux / Unix会给你一个“分段错误”。
另外,请参阅Why are NULL pointers defined differently in C and C++?以获取标准
中空指针的引用答案 2 :(得分:2)
它没有在C ++中定义,所以它可能不会在某些操作系统上崩溃,但你可以指望在Windows和Linux的当前(和以前的)版本下崩溃,因为这些都不会让你(作为用户进程)访问该内存位置。
此外,在Windows下,如果要导致程序中断,请尝试DebugBreak();导致异常(MSDN说:在当前进程中发生断点异常。这允许调用线程通知调试器处理异常。)