【发布时间】:2016-01-19 23:52:08
【问题描述】:
我在浏览一些非结构化数据时使用了纯 C 语言的void*,我想在进行时使用取消引用和自动增量进行转换。我想写以下内容:
void* ptr = /*something*/;
uint16_t i = *((uint16_t*) ptr)++;
编译器对象并告诉我“需要作为增量操作数的左值”,但我想我认为将指针转换为指针仍然可以作为左值。
很明显,我的意图是让 ptr 现在指向比之前指向的位置多两个字节。我无法删除 ptr 演员表周围的括号,因为 ++ 的优先级高于演员表,所以这不会像我想要的那样工作:
int i = *(uint16_t*) ptr++;
我当然可以自己递增,如下所示,但我希望得到一些优雅而简洁的东西:
int i = *(uint16_t) ptr;
ptr += sizeof(uint16_t);
有什么好的方法可以做到这一点?
【问题讨论】:
-
"我当然可以..." - 实际上这是不可能的,你不能对 void 指针进行算术运算
-
@M.M:嗯,gcc 确实允许将其作为扩展名(行为类似于
char *)。当然,这并不意味着你应该这样做。 -
如果您有一些八位字节的数据流并想从中提取更大的类型(反序列化),请使用移位/屏蔽。不要依赖“有问题的”功能(没有实际需要)。
-
*((uint16_t*) ptr)++;?? -
为了 gore 的利益,
*(*(uint16_t **)&ptr)++可能会起作用,尽管它会由于别名违规而导致未定义的行为