对于char *
类型的指针(指向int
数组)以sizeof(int)
为增量执行指针算法并稍后取消引用它是不确定的行为?
例如。考虑下面的代码。它会调用未定义的行为吗?
我认为行/*1*/
应该是合法的,/*2*/
肯定是合法的,但我不确定/*3*/
。
有一个prior question提出类似的问题,但没有接受答案。
int foo() {
int arr[10] = {0};
int i = 4;
int s = sizeof(int);
/*1*/ const char * cmem = reinterpret_cast<const char*>(&arr[0]);
/*2*/ cmem += i * s;
/*3*/ return *reinterpret_cast<const int*>(cmem);
}
答案 0 :(得分:3)
这段代码没问题。允许在对象的边界内(或者在结束之后)进行指针运算,并且严格别名规则允许使用仅在const
中与实际对象不同的左值来访问该对象。 / p>