【问题标题】:C99: Is it possible to portably determine if two pointers point within the same aggregate?C99:是否可以便携地确定两个指针是否指向同一个聚合?
【发布时间】:2012-08-23 07:36:17
【问题描述】:

在 c99 中,我的理解是比较两个不指向同一聚合的指针会导致未定义的行为。给定一个聚合 A、一个已知指向 A 内的指针 p_good 和一个可能指向也可能不指向 A 内的指针 p_unknown,是否有可能构造一个具有已定义行为的可移植测试,以确定比较 p_good 和p_unknown?

显然,这个测试本身不能违反比较指针的限制。

我怀疑答案是否定的,但我很乐意看到其他答案。

【问题讨论】:

  • “聚合”是什么意思?你到底想达到什么目的?
  • 你有指向A的指针吗?或者只是指向A的两个指针?
  • @eq 在比较不同数组中的指针是否为相等时没有UB,但比较不同数组中的指针是否不相等是UB,即 , >=.
  • 如果你有一个数组和一个候选指针,你可以比较(==)这个指针和每个可能的元素指针,看看它是否等于其中任何一个。所以,从技术上讲,答案是肯定的:)

标签: c pointers c99 undefined-behavior


【解决方案1】:

你评论了:

另一种表述问题的方法是:给定聚合“A”和指针 p 的定义,是否可以在不违反不等式检验规则的情况下回答“p 是否在 A 内”这个问题?指向不同聚合的指针

我可以有意义地解释这一点的唯一方法是,您要么拥有一个 Aggregate type 类型的对象,要么拥有一个指向该对象的指针。那么答案很简单:

伪代码:

bool p_in_A = false;
for (each element in Aggregate A)
    if (&element == p)
        p_in_A = true;

没有办法判断一个流浪指针是否属于一个未知的聚合对象(或指向聚合中的“中间”元素)。

【讨论】:

  • 是的,这是有道理的。我同意在未知聚合的情况下没有办法做到这一点,但在我的情况下,我确实对 A 有足够的了解,可以使用迭代的相等性检查。有趣的是,避免 UB 需要 O(sizeof(A)) 算法。
  • @acm,对于未知类型的聚合,您只知道基指针和大小,您必须通过将指针转换为unsigned char*,在字节基础上完成所有这些操作。
  • @JensGustedt 在激励的情况下,我确实知道 A 的类型,而且它恰好是 char[],所以它可以在没有强制转换的情况下工作。
  • @JensGustedt,是的。最重要的部分是计算聚合基地址的方法(除了它的大小)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多