某些编译器上的此代码在具有优化和无优化的模式下会产生不同的结果。这意味着代码无效。什么不对?
#include <stdio.h>
#include <stddef.h>
int a = 3;
int b = 5;
int
main (void)
{
size_t delta;
int *ptr;
delta = &b - &a;
ptr = &a + delta;
printf ("%d\n", *ptr);
return 0;
}
答案 0 :(得分:3)
评估表达式&b - &a
是未定义的行为,因为b
和a
不是同一对象的子对象。
答案 1 :(得分:2)
您只能减去指向同一数组元素的指针,或者指向结尾的指针。从C ++ 11标准,5.7.6:
除非两个指针都指向同一个数组对象的元素,或者指向数组对象的最后一个元素,否则行为将被删除。
答案 2 :(得分:0)
C标准操作差异指针(也许所有的pointernaya算法)仅针对指针定义,查看同一个对象。 “对象”这个词在这里意味着在家庭层面被称为“变量”而不是C ++对象。因此,delta
在标准undefined
方面的总价值。
在两个具有强大的上下文分析器和硬件功能的编译器上,一些棘手的测试工作正常。测试的形式略有不同,但为简单起见,请离开。
答案 3 :(得分:0)
由于您的代码更接近C代码,因此我将引用C标准。根据它
7为了这些运算符的目的,指向一个对象的指针 不是数组的元素与指向第一个元素的指针的行为相同 长度为1的数组的元素,其对象的类型为 元素类型。
和
9当减去两个指针时,两个指针都指向 相同的数组对象,或者超过数组最后一个元素的数组 宾语;结果是两者下标的差异 数组元素。
在您的示例中,两个指针不指向同一个数组的元素。因此行为未定义。