指针的有效性如何与未初始化的指针值交互?

问题描述 投票:0回答:1

我已经看到,在 C 或 C++ 抽象机中,仅在内存中形成指向无效点的点的行为就是未定义的行为。

例如

int* arr = new int[10];
int* last = arr + 9;  // last element
int* end = arr + 10; // past last element, still ok according to the rules
int* another = arr + 11;  // invalid, UB, supposedly, the rest of the program can be invalid

现在假设,这个其他代码

int* arr;  // arr can be invalid already here, UB?
int* another = arr;  // forming a pointer to possibly invalid memory, UB?

分配未初始化的指针与通过操作形成无效指针有何不同?有那么糟糕吗?

c++ language-lawyer undefined-behavior pointer-arithmetic
1个回答
0
投票
int* arr;  // arr can be invalid already here, UB?`

不是 UB,因为在这里您没有使用/访问

arr
的值。

int* another = arr;  // forming a pointer to possibly invalid memory, UB?

UB,因为您正在访问一个不确定的值来分配/初始化给另一个值。

分配未初始化的指针与通过操作形成无效指针有何不同?有那么糟糕吗?

它们在技术上都是未定义的行为,因此从语言律师的角度来看,它们同样糟糕,因为它们允许代表实现的任意行为。

未定义的行为没有“层级”。

© www.soinside.com 2019 - 2024. All rights reserved.