加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

以下类型转换在C中做了什么?

发布时间:2020-12-16 09:44:52 所属栏目:百科 来源:网络整理
导读:我对C中的类型转换有疑问: void *buffer;(int *)((int)buffer); 这种类型的铸造做什么?和((int)缓冲区)做什么? 解决方法 想象一下,你和我一样在Linux / x86-64计算机上.那么指针是64位,int是32位宽. 因此,缓冲区变量已初始化到某个位置;也许0x7fff4ec5202
我对C中的类型转换有疑问:

void *buffer;

(int *)((int)buffer);

这种类型的铸造做什么?和((int)缓冲区)做什么?

解决方法

想象一下,你和我一样在Linux / x86-64计算机上.那么指针是64位,int是32位宽.

因此,缓冲区变量已初始化到某个位置;也许0x7fff4ec52020(可能是某些局部变量的地址,也许在main内部).

cast(int)缓冲区为您提供了一个int,可能是最低有效32位,即0x4ec52020

您正在使用(int *)((int)buffer)再次强制转换,它会为您提供虚假地址0x000000004ec52020,它不会指向有效内存.如果你取消引用那个虚假的指针,你很可能会得到一个SIGSEGV.

所以在某些机器上(特别是我的)(int *)((int)buffer)与(int *)buffer不同;

幸运的是,作为语句,(int *)((int)buffer);没有明显的副作用,并将由编译器优化(通过“删除”它)(如果你要求它进行优化).

所以这样的代码是一个巨大的错误(可能会成为一个undefined behavior,例如,如果您取消引用该指针).如果原始编码器真的想要这里描述的奇怪语义,他应该添加注释(并且这样的代码是不可移植的)!

也许#include-ing< stdint.h>使用intptr_t或uintptr_t可能更有意义.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读