C有更多像NULL这样的宏吗?

Met*_*ark 3 c null hashtable

背景:

删除使用线性探测的哈希表中的单元格时,必须指示该单元格曾存在一个值,但在搜索期间可以跳过该值.解决此问题的最简单方法是添加另一个变量来存储此信息,但如果已知有保证的无效内存地址并用于表示此状态,则可以避免使用此额外变量.

题:

我假设因为0是一个保证无效的内存地址(通常不是),所以必须不仅仅是NULL.所以我的问题是,C是否为任何其他保证的无效内存地址提供标准宏?

Pas*_*uoq 7

从技术上讲,NULL不保证无效.它只保证不是任何对象的地址(C11 6.3.2.3:3):

值为0的整型常量表达式或类型为void*的表达式称为空指针常量(66).如果将空指针常量转换为指针类型,则保证将结果指针(称为空指针)与指向任何对象或函数的指针进行比较.

(66)宏NULL在(和其他头部)中定义为空指针常量

您的使用不要求特殊地址值无效:显然,您没有访问它,除非segfaulting是程序正常行为的一部分.

因此,您可以使用任意数量的对象的地址,只要这些对象的地址不是单元格的正常内容的一部分.

例如,对于在指向对象的指针之间进行转换来保留表示的体系结构,您可以使用:

char a, b, …;
#define NULL1 (&a)
#define NULL2 (&b)
…
Run Code Online (Sandbox Code Playgroud)