int array[10];
int* a = array + 10; // well-defined
int* b = &array[10]; // not sure...
Run Code Online (Sandbox Code Playgroud)
最后一行是否有效?
一些C或C++程序员惊讶地发现即使存储无效指针也是未定义的行为.但是,对于堆或堆栈数组,可以存储一个超过数组末尾的地址,这允许您存储"结束"位置以便在循环中使用.
但是从单个堆栈变量形成指针范围是未定义的行为,如:
char c = 'X';
char* begin = &c;
char* end = begin + 1;
for (; begin != end; ++begin) { /* do something */ }
Run Code Online (Sandbox Code Playgroud)
虽然上面的例子很没用,但是如果某个函数需要一个指针范围,那么这可能很有用,而且你有一个只有一个值来传递它的情况.
这是未定义的行为吗?