gpt4 book ai didi

c++ - 指针赋值

转载 作者:太空宇宙 更新时间:2023-11-04 14:59:12 25 4
gpt4 key购买 nike

是什么意思
*(int *)0 = 0; 

编译成功

最佳答案

没有任何意义。那是一个错误。解析成这样

(((int)0) = 0)

因此,尝试分配给一个右值。在这种情况下,右侧是 0int 的转换(无论如何,它已经是一个 int)。强制转换为非引用的结果始终是右值。然后您尝试将 0 分配给它。 Rvalues 缺少的是对象标识。以下将起作用:

int a;
(int&)a = 0;

当然你也可以这样写

int a = 0;

更新:问题格式错误。实际代码是这样的

*(int*)0 = 0

好吧,现在它一个左值。但是一个基本的不变量被打破了。标准说

An lvalue refers to an object or function

您分配给的左值既不是对象也不是函数。该标准甚至明确指出取消引用空指针((int*)0 创建这样的空指针)是未定义的行为。程序通常会在尝试写入此类取消引用的“对象”时崩溃。 “通常”,因为取消引用的行为已经被 C++ 声明为未定义。


另请注意,上面的内容与下面的内容不同:

int n = 0;
*(int*)n = 0;

虽然上面写的东西肯定没有对象,但这个写的东西是将 n 重新解释为指针的结果。到指针值的映射是实现定义的,但大多数编译器只会在这里创建一个指向地址零的指针。某些系统可能会在该位置保存数据,因此这一个可能有更多机会存活 - 取决于您的系统。这不一定是未定义的行为,而是取决于调用它的编译器和运行时环境。

如果您了解上述对空指针的解引用(只有值为 0 的常量表达式转换为指针会产生空指针!)和下面对重新解释的零值整数的解引用之间的区别,我认为您已经学到了一些重要的东西。

关于c++ - 指针赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/886546/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com