gpt4 book ai didi

c - 如何安全地将 void* 转换为 C 中的 int?

转载 作者:太空宇宙 更新时间:2023-11-04 06:08:42 24 4
gpt4 key购买 nike

也许,我不应该施法。这是我正在做的:

我正在编写一段代码,将 Linux 设备驱动程序链接到更高级别的库。该库的作者使用 void *(通过 typedef 的新名称)来存储描述通信 channel 的实现特定对象的句柄。

我想与库连接的驱动程序使用 int 来存储其 channel 的句柄(因为它们是调用 open() 返回的文件描述符)。因此,在我的代码中,我得到了从库中传入的 void * 并且需要使用 int 从驱动程序中调用内容,反之亦然。即:

// somewhere in the library ...
typedef void* CAN_HANDLE;

// ... in my code
CAN_HANDLE canOpen_driver(s_BOARD *board)
{
int fd;
// ...
fd = open(busname, O_RDWR);
// ...
return (CAN_HANDLE) fd; // <-- not safe, especially not when converting back.
}

其他人编写的适配器实际上在某处存储了一些结构等,只是在指针之间转换,因此不会出现大小问题。就我而言,我真的不想像操作系统那样管理文件描述符。

在我的 PC 上,我认为指针比 int 大,所以我可以稍微调整一下,但代码也进入了嵌入式系统,我经验不足,无法对这些机器上的类型大小做出任何假设。

最佳答案

编辑:当然你不需要一个结构,你可以只为一个普通的 int 分配内存。

CAN_HANDLE canOpen_driver(s_BOARD *board)
{
int *fd = malloc(sizeof(int));
if (fd)
{
// ...
*fd = open(busname, O_RDWR);
// ...
return (CAN_HANDLE) fd;
}

// failure
return NULL;
}

这假设有一个匹配的清理调用。像这样的东西:

void canClose_driver(CAN_HANDLE handle)
{
int *fd = handle;
free(fd);
}

关于c - 如何安全地将 void* 转换为 C 中的 int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4923232/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com