繁体   English   中英

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

[英]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_createptr_to_int转换回来的时候。

这在技术上仍然不是可移植的ISO C,因为:

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

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

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

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

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

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM