2016-01-24 85 views
1

我已经在C中实现了一个AVL树。之后我才读到指针比较只在同一个数组中的对象之间有效。在我的实施中,我做了一些平等测试。例如,要测试一个节点是否是父节点的正确子节点,我可能会测试node==node->parent->right。但是,节点根据需要分配,而不是连续的块。这种行为是否定义?如果不是,你会如何编写这段代码?C - 比较不同分配的指针?

+4

* t指针比较仅在同一数组中的对象之间有效* - 您在哪里读过这些废话? –

+0

@EdHeal我猜他读的是指_in_-equality测试,比如索引或类似的东西。 –

+1

它可能指小于或大于比较。也许你可以从你阅读的地方提供一个报价? – juanchopanza

回答

5

平等和不平等,在标准(ISO/IEC 9899:2011)§6.5.9相等运算¶6说:

两个指针比较平等的,当且仅当是空指针,无论是是指向同一个对象的指针(包括指向一个对象和一个子对象的指针)或函数,它们都是指向一个指向同一个数组对象的最后一个元素的指针,或者是指向一个指针的指针数组对象,另一个是一个指向不同数组对象的开始的指针,它恰好紧随地址空间中的第一个数组对象。

在比较指向无关对象的指针时,没有未定义的行为用于平等或不等式。

相比之下,§6.5.8关系运算符¶5说:

当两个指针进行比较,结果依赖于对象的地址空间中的相对位置指向。如果指向对象类型的两个指针都指向同一个对象,或者两个指向同一个数组对象的最后一个元素,则它们会相等。如果指向的对象是同一个聚合对象的成员,那么稍后声明的结构成员的指针比结构中较早声明的成员的指针要多,指向具有较大下标值的数组元素的指针比指向同一数组元素的指针大具有较低的下标值。所有指向同一联合对象成员的指针都相等。如果表达式P指向数组对象的元素并且表达式Q指向同一数组对象的最后一个元素,则指针表达式Q + 1的比较大于P.在所有其他情况下,行为是未定义的。

这意味着,与>>=<<=比较指针时指针没有指向相同的对象(在报价中潜心详细给出“相同的对象”的定义),该行为是未定义。