将内容复制到void*指针

4

我有一个函数getData(void* data),它应该将一些内部计算出的值复制到data中,例如int r = getRadius();,r应该被复制到data中,并以这种方式从函数getData返回。请问正确的方法是什么?我尝试过*(int*)data = r;,但我不确定这是否是最佳解决方案。


1
如果您预先知道data所引用的内存类型,则*(int *)data = r;是完全正确的。 - user529758
你为什么一开始要使用 void* 指针? - Adam Rosenfield
这是我的系统的API - 与此无关 :) - YAKOVM
2个回答

9

如果您确定void指针引用的内存是int类型,那么您就可以放心地

*(int *)data = r;

然而,更好的通用解决方案是:
memcpy(data, &r, sizeof(int));

这样,您就不必担心字节对齐或其他可能的问题。

*(int *)data = r; 相关的字节对齐陷阱是什么(与 memcpy() 无关)? - Alok Singhal
1
@Alok,如果data的内存位置不是sizeof(int)(或更具体地说,int数据的对齐方式)的倍数,那么代码就是未定义的。 memcpy()可以在没有任何对齐的情况下工作。 - Dave
@Dave,memcpy()调用可能是良好定义的,但如果data未正确对齐到int,它有什么用处呢? - Alok Singhal
1
这真的取决于你如何使用数据。如果它是紧密打包的,例如网络传输,那么你将处理不对齐的数据。 - Dave
@alok,“getData”应该自己处理,避免对“void*”的对齐做出任何假设。无论调用方是否有错误对齐,以及它们是否正确处理它(可能通过自己使用“memcpy”),都是另一回事。 - ugoren

0

我认为使用你展示的API没有好的方法。dbeer的解决方案肯定有效,但API本身存在问题。

如果函数返回一个整数半径,则输出参数应该是int *
不过我猜这并不简单。真正的函数更可能是像getData(int what, void *data)这样的东西,其中what的值决定了数据类型。
这样的API不好,因为它阻止了编译器(以及您在阅读代码时)正确检查类型。

但是,如果您希望坚持使用此API,请至少添加一个大小参数,并在写入data之前进行验证。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接