我有一个函数getData(void* data)
,它应该将一些内部计算出的值复制到data中,例如int r = getRadius();
,r应该被复制到data中,并以这种方式从函数getData返回。请问正确的方法是什么?我尝试过*(int*)data = r;
,但我不确定这是否是最佳解决方案。
我有一个函数getData(void* data)
,它应该将一些内部计算出的值复制到data中,例如int r = getRadius();
,r应该被复制到data中,并以这种方式从函数getData返回。请问正确的方法是什么?我尝试过*(int*)data = r;
,但我不确定这是否是最佳解决方案。
如果您确定void指针引用的内存是int类型,那么您就可以放心地
*(int *)data = r;
memcpy(data, &r, sizeof(int));
*(int *)data = r;
相关的字节对齐陷阱是什么(与 memcpy()
无关)? - Alok Singhaldata
的内存位置不是sizeof(int)
(或更具体地说,int数据的对齐方式)的倍数,那么代码就是未定义的。 memcpy()
可以在没有任何对齐的情况下工作。 - Davememcpy()
调用可能是良好定义的,但如果data
未正确对齐到int
,它有什么用处呢? - Alok Singhal我认为使用你展示的API没有好的方法。dbeer的解决方案肯定有效,但API本身存在问题。
如果函数返回一个整数半径,则输出参数应该是int *
。
不过我猜这并不简单。真正的函数更可能是像getData(int what, void *data)
这样的东西,其中what
的值决定了数据类型。
这样的API不好,因为它阻止了编译器(以及您在阅读代码时)正确检查类型。
但是,如果您希望坚持使用此API,请至少添加一个大小参数,并在写入data
之前进行验证。
data
所引用的内存类型,则*(int *)data = r;
是完全正确的。 - user529758void*
指针? - Adam Rosenfield