在有优化和没有优化的模式下有不同的结果
Different result in a mode with optimizations and without optimizations
某些编译器上的此代码在优化和不优化模式下给出不同的结果。这意味着代码无效。什么是不正确的?
#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
是未定义的行为,因为b
和a
不是同一对象的子对象。
您只能减去指向同一数组元素的指针,或者减去末尾的指针。从 C++11 标准 5.7.6:
除非两个指针都指向同一数组对象的元素,或者一个指针指向数组对象的最后一个元素,否则行为是未定义的。
C 标准运算差分指针(也许是所有 pointernaya 算术)仅针对指针定义,查看同一对象。这里的"对象"一词是指在家庭层面被称为"可变"而不是C++对象。因此,delta
总值在标准undefined
方面。
在两个具有强大上下文分析器和硬件功能的编译器上,完成了一些棘手的测试,可以正常工作。测试的形式略有不同,但为了简单起见,请离开。
由于您的代码更接近 C 代码,因此我将引用 C 标准。根据它
7 对于这些运算符,指向以下对象的指针 数组的元素的行为与指向第一个元素的指针不同 长度为 1 的数组的元素,对象类型为其 元素类型。
和
9 当减去两个指针时,两个指针都应指向 相同的数组对象,或超过数组最后一个元素的对象 对象;结果是两者下标的差异 数组元素。
在您的示例中,两个指针不指向同一数组的元素。所以行为是不确定的。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- 空基优化子对象的地址
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- 关闭||运算符优化
- 使用QProcess执行命令,并将结果存储在QStringList中
- 为什么我的程序在 O0 和 O2 的优化级别返回不同的结果
- G++:优化 -march=haswell 和更新的变化数值结果
- 未经GCC优化而编译的简单C++程序不会产生预期的结果
- C/C++编译器是否会通过重用最近计算的函数结果来优化代码?
- 在有优化和没有优化的模式下有不同的结果
- visual c++中,没有编译器优化的数字代码会给出错误的结果
- 为什么当递归函数结果相乘时,g++ 仍然优化尾递归
- if/else优化测试结果令人震惊
- 使用clang优化编译时得到意外结果
- 安全的数学优化,同样的公式在不同的行上,不同的结果
- 提振.Interprocess: testcase在使用或不使用优化(GCC)编译时会给出不同的结果
- 启用优化后的不同浮点结果-编译器错误
- Visual Studio 2010 O2优化给出错误结果