有一个process_create()
函数,它的参数为void*
. 如果我想传入一个int
,我该怎么做才能避免编译器的构建错误?我无法将参数列表更改为process_create()
2 回答
为了安全起见,您可以将整数转换为intptr_t
,保证与指针大小相同,然后返回。
#include <inttypes.h>
inline void *int_to_ptr(int n) {
return (void *) (intptr_t) n;
}
inline int ptr_to_int(void *p) {
return (int) (intptr_t) p;
}
int_to_ptr
调用时使用process_create
,以及ptr_to_int
转换回来时使用。
这在技术上仍然不是可移植的 ISO C,因为:
虽然可以保证任意指针将在往返往返中存活下来,但即使从不对应于有效指针(例如 1)
intptr_t
的值创建指针也是未定义的行为。理论上,实现可能会阻塞intptr_t
无效的指针,或者整数值可能无法在从intptr_t
到指针和返回的往返中幸存下来。理论上,一些 C 实现可能有
int
比指针更宽的指针,在这种情况下,一些有效的整数值会溢出到intptr_t
.
这两种情况在实践中都极不可能遇到。广泛部署和可移植软件中的 C 代码为此目的使用上述类型转换。
您可以将int
to 转换为void*
,但这不是可移植的。例如,尽管不太可能,但可以想象sizeof(int)>sizeof(void*)
. 所以,如果你想要便携,你应该传递一个指向int
.
例如,您可以为int
with分配存储空间malloc
。
int *myparam = malloc(sizeof(*myparam));
*myparam = 42;
process_create(myparam);
如果不知道更多关于什么process_create
是什么和做什么,我不能说谁应该负责调用free
该内存块。
我的假设是异步的,并且可以在调用返回process_create
后的某个时间读取指针。process_create
但是,如果将在执行期间读取指针,process_create
则可以使其更简单。
int myparam = 42;
process_create(&myparam);
所以,底线是我认为最好传递一个int*
to process_create
。具体如何实现取决于process_create
.