You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C语言中能否无未定义行为(UB)地检测对象或数组是否重叠?

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

问题1:在C语言中能否不触发未定义行为(UB)的前提下检测两个对象是否重叠?

不能。根据上述C标准规则,只有当两个指针指向同一聚合对象(结构体、数组、联合)的成员/元素,或指向同一对象/同一数组末元素后的位置时,指针比较操作才是合法的。如果两个对象是完全独立的、不属于同一聚合的实体,对它们的指针进行比较(以判断是否重叠)会直接触发未定义行为,因此没有通用的、无UB的方法来检测任意两个对象是否重叠。

问题2:若拥有两个指向同类型数组的指针且已知数组长度,能否无UB地判断这些数组是否不重叠?

分两种情况:

  • 如果两个数组属于同一聚合对象(比如是同一个结构体的数组成员,或是同一个大数组的连续子数组),则可以合法判断:若数组A的起始指针大于数组B的末尾指针(B + len_B),或数组B的起始指针大于数组A的末尾指针(A + len_A),则可确定两个数组不重叠。这种指针比较符合标准中“同一聚合对象成员/数组元素指针比较”的合法场景,不会触发UB。
  • 如果两个数组是完全独立的对象(不属于同一聚合),则无法无UB地判断是否不重叠。因为此时对两个数组的指针(或数组末尾后的指针)进行比较属于标准规定的“其他情况”,会触发未定义行为,任何基于这种比较的判断都是不合法的。

内容的提问来源于stack exchange,提问作者0___________

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 19:20:12