有一个process_create()
函数,其参数为void*
。
如果我想传入int
,我怎么能这样做以避免编译器的构建错误?
我无法将参数列表更改为process_create()
答案 0 :(得分:4)
为安全起见,您可以将整数转换为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,因为:
虽然可以保证任意指针在往返intptr_t
并返回时仍然存在,但是甚至从intptr_t
值创建指针也是未定义的行为,如不对应于有效指针,例如1.理论上,实现可能会阻塞无效指针,或者整数值可能无法在从intptr_t
到指针和返回的往返中存活。
理论上,某些C实现可能比指针宽int
,在这种情况下,一些有效的整数值将溢出到intptr_t
。
这两种情况在实践中都不太可能遇到。广泛部署的便携式软件中的C代码为此目的使用如上所述的演员表。
答案 1 :(得分:1)
您可以将int
转换为void*
,但这不是可移植的。例如,sizeof(int)>sizeof(void*)
可以想象,尽管不太可能。因此,如果您想要可移植,则应该将指针传递给int
。
例如,您可以使用int
为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*
传递给process_create
。具体如何实现这取决于process_create
的操作。