Voi*_*tar 1 c pointers avl-tree dynamic-memory-allocation
我在C中实现了一个AVL树.后来我才读到指针比较仅在同一个数组中的对象之间有效.在我的实现中,我做了一些相等的测试.例如,要测试节点是否是我可能测试的父节点的右子节点node==node->parent->right.但是,节点是根据需要分配的,而不是在连续的块中.是否定义了此行为?如果不是,你会如何编写这段代码呢?
对于平等和不平等,在标准(ISO/IEC 9899:2011)§6.5.9中,等式运算符6表示:
两个指针比较相等,当且仅当两个都是空指针时,两者都是指向同一对象的指针(包括指向对象的指针和开头的子对象)或函数,两者都是指向同一数组的最后一个元素的指针对象,或者一个指向一个数组对象末尾的指针,另一个是指向紧跟在地址空间中第一个数组对象之后的另一个数组对象的开头的指针.
在比较指向不相关对象的指针以获得相等或不等时,没有未定义的行为.
相比之下,§6.5.8关系运算符5说:
比较两个指针时,结果取决于指向的对象的地址空间中的相对位置.如果两个指向对象类型的指针都指向同一个对象,或者两个指针都指向同一个数组对象的最后一个元素,则它们相等.如果指向的对象是同一聚合对象的成员,则指向稍后声明的结构成员的指针比指向结构中先前声明的成员的指针大,指向具有较大下标值的数组元素的指针比指向同一数组的元素的指针大.具有较低的下标值.指向同一个union对象的成员的所有指针都比较相等.如果表达式P指向数组对象的元素,并且表达式Q指向同一数组对象的最后一个元素,则指针表达式Q + 1比较大于P.在所有其他情况下,行为是未定义的.
这意味着,比较用的指针>,>=,<或<=当指针没有指向相同的对象(在报价中潜心详细给出"相同的对象"的定义),其行为是未定义.