bit*_*e35 4 c arrays undefined-behavior
假设我们分配了一个由10个元素组成的字节数组。定义了访问范围内的任何元素。
我了解超出范围的元素读写是未定义的行为。获取超出范围的数组元素的地址是否是未定义的行为?
例:
#include <stdint.h>
#include <string.h>
int main(void)
{
uint8_t buf[10];
memset(buf, 0, sizeof(buf));
// Defined behavior
uint8_t a_value = buf[9];
// Defined behavior
buf[0] = 1;
// Undefined behavior?
uint8_t *addr = &buf[10];
}
Run Code Online (Sandbox Code Playgroud)
APr*_*mer 10
&buf[10]是一个特例。您可以获取不带UB的数组“最后一个元素”的地址。但是您不能走得更远,也不能走在第一个元素之前。因此&buf[11],&buf[-1]是UB。
根据要求,取自C18的最新可用草案。
6.5.3.2/3解释&buf[10]等效于buf+10:
同样,如果操作数是[]运算符的结果,则不会对&运算符或[]所隐含的一元*进行求值,并且结果就好像删除了&运算符并将[]运算符更改为+运算符。
和6.5.6 / 8为我们提供了有关以下行为的信息+:
此外,如果表达式P指向数组对象的最后一个元素,则表达式(P)+1指向一个数组对象的最后一个元素,如果表达式Q指向一个数组对象的最后一个元素,表达式(Q)-1指向数组对象的最后一个元素。如果指针操作数和结果都指向同一数组对象的元素,或者指向数组对象的最后一个元素,则求值不应产生溢出;否则,行为是不确定的。
| 归档时间: |
|
| 查看次数: |
97 次 |
| 最近记录: |