8
#include <iostream>

int main()
{
    int* i = 0;
    int x = (*i);
    std::cout << x;
}

上面的程序在我编译和运行它时会崩溃Visual Studio 2010,我知道它会崩溃,因为我将指针设置为 0。

我想知道的是,访问null pointer标准中定义的 C++ 中的 a 还是未定义的,我碰巧幸运的是我的程序由于我的编译器/计算机/操作系统而崩溃

如果已定义,当我尝试访问空指针时,C++ 向我保证什么?

4

3 回答 3

9

取消引用空指针将调用未定义的行为。它可能会在不同的编译器上导致不同的事情,甚至更多——如果多次编译,在同一个编译器上可能会发生不同的事情。根本无法保证这种行为。

于 2013-06-12T08:49:05.630 回答
3

使您的进程在这里崩溃的原因是操作系统阻止您的程序摆弄它无权访问的内存(地址 0)。Windows 会给你一个“访问冲突”,Linux/Unix 会给你一个“分段错误”。

另外,请参阅为什么 NULL 指针在 C 和 C++ 中的定义不同?引用标准中的空指针是什么

于 2013-06-12T08:56:22.170 回答
2

它没有在 C++ 中定义,因此它可能不会在某些操作系统上崩溃,但您可以指望在当前(和以前)版本的 Windows 和 Linux 下崩溃,因为这些都不会让您(作为用户进程)访问该内存地点。

另外,在 Windows 下,如果要导致程序中断,请尝试 DebugBreak(); 这会导致异常(MSDN 说:导致当前进程中发生断点异常。这允许调用线程向调试器发出信号以处理异常。)

于 2013-06-12T08:59:34.080 回答