我正在管理一个链表,并且使用一个int checker(...)
函数来返回1
是否找到一个元素0
。我还必须删除元素,因此在检查时,我想获取某个找到的元素的地址(如果必须删除)。
我的想法是放置一个“删除模式” if(..)
,使之checker
返回元素的地址而不是return 1;
然后使用它来释放空间。
现在我的问题是,我是否会遇到编写return (int)pointeraddress
函数checker
然后将其重铸到外部的大问题?我从未尝试过像这样的演员。
someint=checker(..);
free((pointertype)someint);```
使用long int也许更安全checker
?我不能uintptr_t
按照其他问题的建议使用,因为对于此任务,我仅需要使用标准C库。
将指针强制转换为从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] 删除。
我来说两句