当前位置: 首页 > 知识库问答 >
问题:

将整数转换为指针是否总是定义良好?

晏兴发
2023-03-14
int main() {
    int *p;
    p = reinterpret_cast<int*>(42);
}

查找C++标准,我们有

C++17§6.9.2/3[碱化合物]

3指针类型的每个值都是下列值之一:

    null

C++标准似乎没有更多地说明整数到指针的转换。查阅C17标准:

C17§6.3.2.3/5(强调地雷)

整数可以转换为任何指针类型。除了前面指定的,结果是实现定义的,可能没有正确对齐,可能没有指向引用类型的实体,并且可能是一个陷阱表示。68)

对我来说,似乎任何不适合[basic.compated]中列表的值都是陷阱表示,因此p=reexpert_cast (42); 是ub。我说得对吗?是否还有其他原因使得p=reexpert_cast (42); 未定义?

共有1个答案

曹浩波
2023-03-14

这不是UB,而是由实现定义的,您已经引用了原因(§8.2.10/5[expr.reinterpret.cast])。如果指针具有无效的指针值,并不一定意味着它具有陷阱表示形式。它可以有一个陷阱表示,编译器必须记录这一点。这里只有一个不安全派生的指针。

请注意,我们总是生成指针值无效的指针:如果一个对象被delete释放,那么指向该对象的所有指针都具有无效的指针值。

使用结果指针也定义了实现(不是UB):

 类似资料:
  • 问题内容: 假设我们始终使用Sun JVM(例如1.5+),将Graphics引用强制转换为Graphics2D是否总是安全的? 我还没有看到它引起任何问题,据我所知,Graphics类是遗留代码,但是Java设计人员不想更改Swing和AWT类的接口以保持向后兼容性。 问题答案: 根据此处的讨论, 从到始终是安全的。但是,我无法对此迅速找到Sun的官方声明。 从Graphics强制转换为Grap

  • 每次需要整数数组时,我都会使用以下代码: 我使用BufferedReader而不是Scanner来降低输入过程中的时间复杂度。然而,当数组大小相对较大时,我想知道这种方法是否比Scanner有效(

  • 问题内容: 有没有一种方法可以使用内置函数在PHP中将指数数转换为整数?格式化功能? 1.2378147769392E + 14至123781477693917 问题答案: number_format(1.2378147769392E+14,0,’‘,’‘) 但是,要处理大量数字,如果要保持精度,应该研究BCMath扩展

  • 问题内容: 的在系统调用 包在Golang返回类型,而底层系统调用实际上返回一个指针。它是如何做到的? 更具体地说,在Golang开发人员的此程序包中,该函数仅返回一个指针。如何将其转换为字节片,就像在Unix软件包中一样? 问题答案: 使用该包,您可以在未导出类型的Mmap方法中执行相同的操作: 这是一个操场的例子。

  • 类似地,这段代码给出了“initialization make integer from pointer with a cast”: 如果我在变量声明的行外做同样的操作,那么消息是一样的,但说的是“赋值”而不是“初始化”: 使用其他流行编译器进行的测试也会给出错误/警告消息: null 为什么不呢?

  • 问题内容: 如果我有: 上面是固定的-我不能更改foo或bar。另外,baz必须在bar内转换回foo struct指针。如何将&foo {}强制转换为interface {},以便在调用bar时可以将其用作参数? 问题答案: 要打开到一个很简单: 为了返回到,您可以执行 类型断言 : 或 类型开关 (类似,但可以是多种类型则很有用):