在新版《GCC》中,不同出处的指针可以等同:

// test.c
#include <stdio.h>

int a[4];
int b[4];

int main() {
    puts(a+4 == b ? "equal" : "inequal");
    return 0;
}
$ gcc --version
gcc (GCC) 13.2.1 20230801
$ gcc test.c && ./a.out
equal

此行为是否符合c标准?

推荐答案

这是允许发生的,但不能保证.

C standard条中关于相等运算符的第6.5.9p6节规定:

Two pointers compare equal if and only if两者都是空指针,都是 是指向同一对象的指针(包括指向对象的指针和 开头的子对象)或函数,两者都是指向一个 经过相同数组对象的最后一个元素,or one is a pointer to one past the end of one array object and the other is a pointer to the start of a different array object that happens to immediately follow the first array object in the address space.109)

...

  1. Two objects may be adjacent in memory,因为它们是较大数组的相邻元素,或者 struct 的相邻成员之间没有填充,or because the implementation chose to place them so, even though they are unrelated.如果先前的无效指针操作(如访问 数组边界之外)产生未定义行为,后续比较也会产生未定义行为 行为

一些编译器可能知道指针的出处,并可以使用该知识来决定这种比较是否正确.

另请参阅:Can an equality comparison of unrelated pointers evaluate to true?

C++相关问答推荐

是否可以在C中进行D3 D12申请?

当打印字符串时,为什么在c中没有使用常量限定符时我会收到警告?

为什么可以通过指向常量int的指针间接地改变整数的值?

LibpCap禁用监视器模式(C、MacOS)

C中函数类型的前向声明

为什么该函数不将参数值保存到数据 struct 中?

对重叠字符串使用MemMove

为什么中断函数会以这种方式影响数组?

C指针概念分段故障

从TCP连接启动UDP(C套接字)

在C++中父进程和子进程中的TAILQ队列同步问题

C整型和_泛型.哪些类型是兼容的?

链表删除 node 错误

如何读取程序中嵌入的数据S自己的ELF?

如何在zOS上编译共享C库

如何在C宏定义中包含双引号?

被调用方函数内部的C-Struct变量,它是指针还是无关紧要

将char*数组深度复制到 struct 中?

gdb - 你能找到持有内部 glibc 锁的线程吗?

运行以下 C 程序时出现分段错误