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

use*_*316 3 c casting

我对C中的类型转换有疑问:

void *buffer;

(int *)((int)buffer);
Run Code Online (Sandbox Code Playgroud)

这种类型的铸造做什么?这是((int)buffer)做什么的?

Bas*_*tch 5

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

所以,buffer变量已初始化到某个位置; 也许0x7fff4ec52020(可能是某些局部变量的地址,也许在里面main).

演员(int)buffer给你一个int,可能是最不重要的32位,即0x4ec52020

你再次使用(int*)((int)buffer),它会给你伪造的地址0x000000004ec52020,它不会指向有效的内存.如果你取消引用那个虚假的指针,你很可能会得到一个SIGSEGV.

因此,在一些机器上(特别是矿)(int *)((int)buffer)不一样(int*)buffer;

幸运的是,作为一个声明,(int *)((int)buffer);没有明显的副作用,并且将被编译器优化(通过"删除"它)(如果你要求它进行优化).

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

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