3

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

4

2 回答 2

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. 虽然可以保证任意指针将在往返往返中存活下来,但即使从不对应于有效指针(例如 1)intptr_t的值创建指针也是未定义的行为。理论上,实现可能会阻塞intptr_t无效的指针,或者整数值可能无法在从intptr_t到指针和返回的往返中幸存下来。

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

这两种情况在实践中都极不可能遇到。广泛部署和可移植软件中的 C 代码为此目的使用上述类型转换。

于 2012-12-05T12:16:25.400 回答
1

您可以将intto 转换为void*,但这不是可移植的。例如,尽管不太可能,但可以想象sizeof(int)>sizeof(void*). 所以,如果你想要便携,你应该传递一个指向int.

例如,您可以为intwith分配存储空间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.

于 2012-12-05T11:40:37.033 回答