【发布时间】:2017-04-10 23:21:03
【问题描述】:
以sizeof(int) 为增量对char * 类型的指针(指向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);
}
【问题讨论】:
-
没关系。你也可以只做
(arr+i)如果你有一个 T 类型的指针 p1 和一个指向相同地址的 char 指针 p2,那么 'p1 + i' 等于 '*(p2 + i * sizeof(T))'。
标签: c++ pointers language-lawyer