[英]on 64bit system, how to pass in int as void *
有一个process_create()
函数,它的参数为void*
。 如果我想传入一个int
,我怎么能这样做以避免编译器的构建错误? 我无法将参数列表更改为process_create()
为了安全起见,您可以将整数转换为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代码为此目的使用如上所述的演员表。
您可以将int
为void*
,但这不是可移植的。 例如,可以想象, sizeof(int)>sizeof(void*)
,尽管有些不太可能。 因此,如果您想要可移植,则应该将指针传递给int
。
例如,您可以使用malloc
为int
分配存储空间。
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
的操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.