在有优化和没有优化的模式下有不同的结果

Different result in a mode with optimizations and without optimizations

本文关键字:优化 结果 模式      更新时间:2023-10-16

某些编译器上的此代码在优化和不优化模式下给出不同的结果。这意味着代码无效。什么是不正确的?

#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 ("%dn", *ptr);
  return 0;
}

计算表达式&b - &a是未定义的行为,因为ba不是同一对象的子对象。

您只能减去指向同一数组元素的指针,或者减去末尾的指针。从 C++11 标准 5.7.6:

除非两个指针都指向同一数组对象的元素,或者一个指针指向数组对象的最后一个元素,否则行为是未定义的。

C 标准运算差分指针(也许是所有 pointernaya 算术)仅针对指针定义,查看同一对象。这里的"对象"一词是指在家庭层面被称为"可变"而不是C++对象。因此,delta总值在标准undefined方面。

在两个具有强大上下文分析器和硬件功能的编译器上,完成了一些棘手的测试,可以正常工作。测试的形式略有不同,但为了简单起见,请离开。

由于您的代码更接近 C 代码,因此我将引用 C 标准。根据它

7 对于这些运算符,指向以下对象的指针 数组的元素的行为与指向第一个元素的指针不同 长度为 1 的数组的元素,对象类型为其 元素类型。

9 当减去两个指针时,两个指针都应指向 相同的数组对象,或超过数组最后一个元素的对象 对象;结果是两者下标的差异 数组元素。

在您的示例中,两个指针不指向同一数组的元素。所以行为是不确定的。