首页 > 解决方案 > 将 void 指针转换为“类型”变量或使用 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;
}

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

标签: cembedded

解决方案


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

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


推荐阅读