如何理解输出?

时间:2010-11-11 15:09:08

标签: c++ syntax

int main(int argc, char** argv)
{
    try {
            char *p2 = NULL;
            cout << "p2:" << strlen(p2) <<endl; 
                    cout << "mark";
        }
        catch (...) {
            cout << "caught exception" <<endl;
        }
    return 0;
}

输出为p2:,因此cout << "mark";cout << "caught exception" <<endl;都没有运行,为什么?

5 个答案:

答案 0 :(得分:6)

在C ++中,取消引用NULL指针会导致未定义的行为,这意味着任何事情都可能发生:计算机可能爆炸,函数可能返回任意值,程序可能被操作系统杀死异常(与C ++表达式不同,它不能被try-catch捕获)。

简而言之,不要这样做

如果您真的需要这样做是出于一个非常好的理由(比如解决库中的错误而无法控制),请查看操作系统对此类内容的支持(例如SEH on窗口)。

答案 1 :(得分:5)

在符合POSIX标准的系统上,您的程序会收到SIGSEGV信号,并在您致电strlen(p2)后立即死亡,因为p2NULL。< / p>

据我所知,没有办法使用C ++异常来移植segfaults

答案 2 :(得分:3)

您的代码有未定义的行为。因此,任何输出或输出都是有效结果。我的猜测是strlen导致访问冲突(至少在x86上)并且您的程序正在终止。

在尝试取消引用空指针时,C ++不会抛出异常。

答案 3 :(得分:2)

strlen()不会抛出异常,因为它是C函数而C没有异常。当你给它输入错误时,它只会崩溃你的程序。 (虽然不需要。)

答案 4 :(得分:0)

strlen(NULL)尝试取消引用NULL指针。这引发了硬件异常,无法通过try-catch机制捕获。节目爆炸了。如果您尝试将除以零执行,则会出现相同的情况。

因此,检查指针是否为(非)NULL总是一个好习惯。如果指针在某处不应该是NULL(并且您将其视为特殊情况),则可以从该位置抛出软件异常。你的catch块的主体会被执行如果你写了这样的东西(在strlen调用之前):

if(p2 == NULL)
    throw 1;

你忘了添加打印“mark”的endl操纵器。它应该是:

cout << "mark" << endl;