【发布时间】:2023-01-30 16:50:30
【问题描述】:
我正在阅读 K&R 中关于数组运算的部分,遇到了一些奇怪的事情。我发布了整个段落作为上下文,但我主要关注粗体部分:
如果
p和q指向同一数组的成员,则==、!=、<、>=等关系可以正常工作。例如,如果p指向比q更早的数组成员,则p < q为真。任何指针都可以有意义地与零进行相等或不相等的比较。但是对于不指向同一数组成员的指针的算术或比较行为是未定义的。 (有一个例外:数组末尾之后的第一个元素的地址可用于指针运算。)我在这里得到了一些答案(C pointer arithmetic for arrays),但我有以下疑问:
我对此有疑问,因为以下代码似乎可以在取消引用和比较的情况下使用,而不会引发任何异常或错误:
#include <stdio.h> int main() { int a[5] = { 1, 2, 3, 4, 5 }; int b[5] = { 1, 2, 3, 4, 5 }; int *p = &a[7]; int *q = &b[3]; printf("%d\n", p); printf("%d\n", q); printf("%d\n", q > p);// relational from different arrays printf("%d", *p); // dereferencing also seems to work }有人能帮忙吗?
代码应该抛出错误
【问题讨论】:
-
"
But the behavior is undefined for arithmetic or comparisons with pointers that do not point to members of the same array." undefined 表示未定义。使用一个编译器似乎有效的东西可能无法使用另一个编译器......一个样本量不是进行评估的良好基础。 -
“下面的代码似乎有效......没有抛出任何异常或错误:”这是未定义行为的最糟糕结果。当魔多大军已经准备好追捕你时,它会产生你可能安全的错觉。