【发布时间】:2017-04-30 04:57:19
【问题描述】:
假设我有一个来自某个外部来源的已知大小的void *buffer(例如,它可能是fread() C API[1],或mmap 调用) .
我可以有效地将这个void * 转换为什么类型的指针,然后从中读取?
如果我知道此数据由 16 位值组成,是否允许将 void * 转换为 uint16_t * 并通过取消引用指针直接读取值?
我知道当然可能存在字节顺序问题,但首先这样做是否合法(例如,对齐怎么样)?
如果以这种方式强制转换整个缓冲区是合法的,那么缓冲区的一部分呢?例如,如果我知道前 64 个字节是 char *,然后接下来的 10,000 个字节是 uint16_t 数据?
[1] 在fread() 的情况下,假设内存是用malloc 分配的。
【问题讨论】:
标签: c io language-lawyer strict-aliasing