在64位系统上,如何传入int作为void *

时间:2012-12-05 10:35:41

标签: c 64-bit system porting

有一个process_create()函数,其参数为void*。 如果我想传入int,我怎么能这样做以避免编译器的构建错误? 我无法将参数列表更改为process_create()

2 个答案:

答案 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,因为:

  1. 虽然可以保证任意指针在往返intptr_t并返回时仍然存在,但是甚至从intptr_t值创建指针也是未定义的行为,如不对应于有效指针,例如1.理论上,实现可能会阻塞无效指针,或者整数值可能无法在从intptr_t到指针和返回的往返中存活。

  2. 理论上,某些C实现可能比指针宽int,在这种情况下,一些有效的整数值将溢出到intptr_t

  3. 这两种情况在实践中都不太可能遇到。广泛部署的便携式软件中的C代码为此目的使用如上所述的演员表。

答案 1 :(得分:1)

您可以将int转换为void*,但这不是可移植的。例如,sizeof(int)>sizeof(void*)可以想象,尽管不太可能。因此,如果您想要可移植,则应该将指针传递给int

例如,您可以使用intmalloc分配存储空间。

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的操作。