【发布时间】:2013-01-08 11:24:08
【问题描述】:
C++ 标准 [sec 5.7] 说:
如果指针操作数和结果都指向同一个数组对象的元素,或者一个过去 数组对象的最后一个元素,评估不应产生溢出;否则,行为是 未定义。
那么,我是否正确假设未定义其他类型的指针,而不是数组?
例如:
int a = 0;
vector<int> v(&a, (&a)+1);
上面的 sn-p 编译和工作都很好(使用 g++),但它有效吗?
【问题讨论】:
-
我想评论一下
pointers one-past-the-end of other types than arrays are undefined?。 指针 总是被定义的,因为它们只是数字、地址。然而,这个指针的 value 是未定义的。您不能取消引用这些指针。但是vector构造函数并没有取消引用它们,所以没关系。 -
是的,但地址空间不是无限的。所以有一个指向地址空间中最后一个元素的指针。增加该指针是没有意义的。
-
指针不仅仅是数字。 C++ 标准非常清楚地表明您不能对指针使用任意加法和减法。特别是在数组之前使用指向 1 的指针以适应基于 1 的算法的做法会导致未定义的行为。 AFAIK 存在或曾经是计算机体系结构,其中将不指向有效内存的值加载到指针寄存器中可能会导致陷阱。
-
"指针总是被定义的,因为它们只是数字、地址。" ——大错特错。听说过段寄存器吗?
-
哪个标准?
标签: c++ pointers pointer-arithmetic