这行代码是什么意思*((int*)(0))=1;
What does this line of code mean *((int*)(0))=1;?
所以问题的代码行是:
*((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;
- "类模板示例<int>;"语句对 C++11 是什么意思?
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- C++ 未初始化的本地(非全局)int 数组中的元素类型到底是什么?
- map<string, int> m= {}; 在C++中是什么意思?
- 行 - " vector<int> used(adj.size(), 0); "是什么意思?
- 使输出流式处理运算符适用于 boost::variant<std::vector<int>、int、double 的正确方法是什么>
- 代码中的"vector<<int>vector>&index"是什么意思?
- 在这种情况下,int**在C中是什么意思
- "1L << count"是什么意思?如何使用超出"unsigned long long int? "范围的语句编号打印?
- "int(i)=1;"是什么意思?
- freq_table[field_pm_value] = map<string, int>(); 是什么意思?
- 统一初始化是隐式发生的,即使 int 强制转换运算符是使用 explicit 关键字声明的.原因是什么?
- map<int,int>的*迭代器是什么?它不是pair<int,int>
- 在C#中等效于未签名的长Int是什么
- "cannot Convert vector<int>* to int"是什么意思?
- <T::* int>是什么意思?
- C++中的新Bytef[int]是什么
- *new int是什么意思?
- A<int(int)>是什么意思?这项技术叫什么名字?