C标准是否保证,在给定type_t* x = NULL; type_t* y = NULL;的情况下,我们总是有x > y求值为假?我之所以这样问,是因为在initial or terminal malloc buffer possible?中的对话中,人们似乎应该小心进行指针比较,粗略地说,只有在处理指向同一数组元素的指针时才进行比较.但是,让x > y计算为假保证是很方便的,因为我想要一个 struct ,它是一个堆栈式数组,具有用于第一个和最后一个元素的字段,如果该数组仍有0个元素,则将这些字段设置为NULL很方便,并且允许for个循环遍历该数组的元素,而无需显式判断该数组是否有0个或更多元素,因此这样的比较是方便的.

推荐答案

令人惊讶的是,在C中,它似乎会导致未定义的行为.只有==!=可以使用空指针.解决方法是将指针指向uintptr_t并比较结果.

C17 6.5.8 Relational operators /5

比较两个指针时,结果取决于地址空间中的相对位置 指向的对象的.如果两个指向对象类型的指针都指向同一对象,或两个都指向 在同一数组对象的最后一个元素之后的一个元素中,它们比较相等.如果对象指向 是同一聚合对象的成员,指向稍后声明的 struct 成员的指针进行比较 大于指向 struct 中先前声明的成员的指针和指向数组元素的指针 下标较大的值与指向相同数组的元素的指针比较大,而下标的值较小 下标数值.指向同一联合对象成员的所有指针都相等.如果表达式 P指向数组对象的元素,而表达式Q指向该数组对象的最后一个元素 数组对象,则指针表达式Q+1比较大于P.In all other cases, the behavior is undefined.

(加粗矿)

这与C++不同,C++中有一个子句明确表示<<=>>===,!=一致:

[expr#rel]/5

如果两个操作数pq比较相等([Expr.eq]),则p<=qp>=q都得到true,而p<qp>q都得到false....

C++相关问答推荐

难以理解Makefile隐含规则

在C++中通过空指针隐式访问常量变量的值

C在声明带有值的数组时,声明大小有用吗?

是否可以使用指针算法在不对齐的情况下在 struct 中相同类型的字段的连续序列之间移动?

如何在C中打印包含扫描字符和整数的语句?

平均程序编译,但结果不好

编译器如何处理具有更复杂值的枚举?

S和查尔有什么不同[1]?

如何使用FSeek和文件流指针在C中查找文件的前一个元素和前一个减go 一个元素

如何在双向表中实现线程安全,每个条目仅使用4位,同时避免任何全局锁?

静态初始化顺序失败是否适用于C语言?

为什么我的二叉树删除删除整个左部分的树?

Valgrind正在使用一个Fexecve电话报告不可能发生的事情

从整型转换为浮点型可能会改变其值.

与指针的原始C数组或C++向量<;向量<;双>>;

函数指针作为函数参数 - 应该使用 const 吗?

当 n 是我们从用户那里获得的整数时,创建 n 个 struct 参数

为什么 int32_t 和 int16_t 在 printf 输出中具有相同的位数?

子进程不会修改父进程中的统计信息

nullptr_t 是否会 destruct 类型双关或指针转换?