繁体   English   中英

将 void 指针转换为“type”变量还是使用 memcpy?

[英]Cast void pointer to “type” variable or use memcpy?

我一直无法找到答案。 我在 C 中使用这些方法中的哪一个重要吗?

int get_int(void *vptr) {
    return *(int *)vptr;
}

或者

int get_int(void *vptr) {
    int i = 0;
    memcpy(&i, vptr, sizeof(int));
    return i;
}

它似乎在我的测试中给出了相同的结果,但在每种情况下都是等价的吗?

,它不是等价的,因为不管你信不信,并非所有指针在所有情况下都是相同的(尽管在 x86+ 架构上它们是相同的)。

然而,演员表将在它被定义的地方工作。

主要区别在于 memcpy 将在更多情况下工作——它只需要从中复制的内存包含适当类型的数据。 强制转换和取消引用要求并且还要求指针对访问该类型有效。 在大多数机器上,这(只是)需要正确对齐。 强制转换还允许编译器假定它不使用不同类型的值作为别名。

最终结果是 memcpy 可能“更安全”,但也可能更贵一些。

但这在每种情况下都是等价的吗?

不。

*(int *)vptr依赖于int对齐。 如果vptr不指向int分配的数据,则结果为 UB。

memcpy()没有比要求。 只要数据不是陷阱(罕见),它就“有效”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM