我对C中的类型转换有疑问:
void *buffer;
(int *)((int)buffer);
Run Code Online (Sandbox Code Playgroud)
这种类型的铸造做什么?这是((int)buffer)做什么的?
想象一下,你和我一样在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_t或uintptr_t可能更有意义.
| 归档时间: |
|
| 查看次数: |
350 次 |
| 最近记录: |