这行代码是什么意思*((int*)(0))=1;

What does this line of code mean *((int*)(0))=1;?

本文关键字:int 是什么 意思 代码      更新时间:2023-10-16

所以问题的代码行是:

*((int*)(0))=1;

因为我对C/c++的经验太少,也没有很努力地去尝试,所以我不理解这个简单的表达式。这到底是什么意思?

表示程序崩溃,通常在调试期间很有用。

它将解引用NULL指针并尝试为该内存赋值,这在理论上只是未定义的行为,但在99%的系统上会导致访问冲突异常。

通常出现在以下情况:

if ( !FileRead(importantFile) )
{
    // this should never happen, critical exception
    *((int*)(0))=1;
}

把它一点一点地分解。在左边的外括号内,有:

(int*)(0)

这是一个c风格的将值0转换为指向int的指针的强制转换;创建一个空指针,实际上

让我们添加一个变量来捕获第一个表达式的结果:
int* x = (int*)(0);

外层现在是:

*(x) = 1;

这是对指针x解引用,并将1赋值给结果int。

由于(在这种情况下)x是一个空指针,它将在解引用时崩溃(严格地说,它将在解引用后的赋值时崩溃——参见下面的注释)。它通常用于强制崩溃或其他系统相关的未定义行为;通常用于测试或调试目的。您不会希望在您的产品代码中出现这样的行。

注意:在某些架构中,通常在嵌入式系统中,0是一个有效的内存地址,上面的代码可能有合法的目的。然而,如果您在这样的平台上工作,那么您不太可能遇到问题中的语法问题。

正如其他人所注意到的,这是一种进入调试器的方法。大多数计算机将拒绝写入内存地址0,而将进入某种诊断模式。

然而,一个更好的选择是标准函数raise(),从<signal.h><csignal>raise( SIGSEGV )将产生与您的示例相同的结果,即使在允许写入地址0的计算机上(这样的机器确实存在!)和对未定义行为有自由解释的编译器上。该操作不能保证,也不能要求崩溃。从编译器的角度来看,它还不如什么都不做,简单地从编译后的程序中删除它也不会是不正确的。

更具描述性的信号值请参见man signal。意思可能是raise( SIGTRAP )abort()。后者在我的系统上相当于raise( SIGABRT ),但我懒得检查POSIX或C语言是否保证这种等效性。

这将某些内容存储在空指针(并导致SEGFAULT)。可用于停止程序和调用调试器,同时保留所有内存内容等

这个*((int*)(0))=1;等于

int *p=NULL;
*p=1;