将指针强制转换为从C中的int函数返回的int是否安全?

瓦特

我正在管理一个链表,并且使用一个int checker(...)函数来返回1是否找到一个元素0我还必须删除元素,因此在检查时,我想获取某个找到的元素的地址(如果必须删除)。

我的想法是放置一个“删除模式” if(..),使之checker返回元素的地址而不是return 1;然后使用它来释放空间。

现在我的问题是,我是否会遇到编写return (int)pointeraddress函数checker然后将其重铸到外部的大问题我从未尝试过像这样的演员。

someint=checker(..);
free((pointertype)someint);```

使用long int也许更安全checker我不能uintptr_t按照其他问题的建议使用,因为对于此任务,我仅需要使用标准C库。

chux-恢复莫妮卡

将指针强制转换为从C中的int函数返回的int是否安全?

强制转换int本身不是问题,但后续步骤可能会丢失信息。

一个int是不是一定往返回等效指针。

一个int可能缺乏足够的位来存储指针所需的所有信息。

someint=checker(..);
free((pointertype)someint); // bad

C(u)intptr_t在标准C库中提供了可选的整数类型

我不能按照其他问题的建议使用uintptr_t,因为对于此任务,我仅需要使用标准C库。

这很好奇,uintptr_t因为自C99以来,所有标准C库中普遍存在这种库。@托马斯·杰格

这些类型足够广泛,可以object_pointertype --> (u)intptr_t --> object_pointertype成功转换-产生的指针等于原始指针

#include <stdint.h>

也许使用long int进行检查更安全?

也许,但不是真的。long可能仍然太狭窄。

long long 可能也太窄,但这不太可能。


转换为整数类型可能是错误的方法

代替“如果找到一个元素则返回1,否则
返回0”,而是考虑“如果找到一个元素则返回地址NULL”。

或类似下面的内容,并将找到的指针存储在中*destination

bool find(void **destination, input parameters );

checker() 需要指出两件事

从设计的角度来看,当找到的指针转换为整数时,可以是任何值,甚至可以是0或1。健壮的设计将仅表示2个独立的事物:找到的指针,该指针的值。将它们汇总在一起意味着某些指针是特殊的,并且永远不能被“发现”。通用链表将支持存储和检索所有指针,包括null指针

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将函数指针强制转换为C中的另一个函数指针是否安全?

从std :: round强制转换为int是否安全?

将size_t强制转换为unsigned long int是否安全?

基于内存对齐将字节数组强制转换为int是否安全?

是否将LONG强制转换为函数指针?

C / C ++将void *强制转换为int(*())(int,...);

将返回对象指针的函数强制转换为返回空指针的函数合法吗?

如何在C ++ 17中将强制转换函数指针静态转换为noexcept?

将返回值强制转换为指针时,c中的内存分配

为什么将指向int的指针转换为void *但将指向函数的指针转换为bool?

将双指针转换为int指针

将int指针转换为char指针

将int指针转换为void指针并返回以在另一个函数中使用该值?

将int array []或指向int array []的指针返回到C中的调用例程的函数

在C中强制转换函数指针的返回类型

是否可以将struct指针转换为c中的函数指针?

对于C#中的正数,强制转换为Int返回与FloorToInt不同的值

无法将python中的str强制转换为int

C ++类型将int强制转换为union

在 C 中将字符数组转换为 int 是否安全?

在C中是否可以将指针转换为双指针?

将 int 转换为字符串指针 C

将int值转换为C和C++中的char指针差异

在C中,将int强制转换为struct *会在内存中发生什么?

将constexpr int []强制转换为void *

强制转换为兼容返回类型的并集是否满足函数指针的兼容性标准?

如何将void指针强制转换为函数指针

当int值在C中保证小于256时,将int指针转换为char指针

c-将指向const int的指针转换为仅指向int的指针(并对其进行修改)