【问题标题】:C - Compare Pointers From Different Allocations?C - 比较来自不同分配的指针?
【发布时间】:2016-04-30 15:18:48
【问题描述】:

我在 C 中实现了一个 AVL 树。直到后来我才读到指针比较仅在同一数组中的对象之间有效。在我的实现中,我进行了某些相等性测试。例如,为了测试一个节点是否是父节点的右子节点,我可以测试node==node->parent->right。但是,节点是根据需要分配的,而不是在一个连续的块中。是否定义了这种行为?如果不是,您将如何编写此代码?

【问题讨论】:

  • t 指针比较只在同一数组中的对象之间有效 - 你从哪里读到这个废话?
  • 它可能是指小于或大于比较。也许你可以提供你读到的地方的报价?
  • 您可以对任意两个指针使用小于、大于。是否有意义是另一回事
  • @M.M - 未定义的行为如何?指针本质上是表示内存中位置的数字
  • 对于相等和不相等,标准(ISO/IEC 9899:2011 §6.5.9)说:两个指针比较相等当且仅当两者都是空指针,两者都是指向相同的对象(包括指向对象的指针和其开头的子对象)或函数,两者都是指向同一数组对象最后一个元素之后的指针,或者一个是指向一个数组对象末尾之后的指针,并且other 是指向不同数组对象的开头的指针,该数组对象恰好紧跟在地址空间中的第一个数组对象之后。比较不相关对象的指针时没有UB。

标签: c pointers dynamic-memory-allocation avl-tree


【解决方案1】:

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

两个指针比较相等当且仅当两个指针都是空指针,都是指向同一个对象(包括一个指向一个对象和一个在其开头的子对象)或函数的指针,两者都是指向最后一个元素的指针相同的数组对象,或者一个是指向一个数组对象末尾的指针,另一个是指向另一个数组对象的开头的指针,该数组对象恰好紧跟在地址空间中的第一个数组对象之后。

在比较指向不相关对象的指针是否相等或不相等时没有未定义的行为。

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

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

这意味着当指针不指向同一个对象时,将指针与>>=<<= 进行比较(对于“相同对象”的定义,在引用中详尽地给出了详细说明),行为未定义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多