【发布时间】:2014-01-01 22:32:56
【问题描述】:
似乎有特定的语言可以将一个的地址多于一个数组结尾。
如果没有取消引用,为什么 2 或 2,000,000 会成为问题?
看一些简单的循环:
int array[];
...
for (int i = 0: i < array_max; ++i)
{
int * x = &array[i *2]; // Is this legal
int y=0;
if (i * 2 < array_max) // We check here before dereference
{
y = *x; // Legal dereference
}
...
}
为什么或在什么时候它变得未定义,实际上它只是将一个 ptr 设置为某个值,如果它没有被引用,为什么它会是未定义的?
更具体地说 - 除了预期会发生什么之外,还有什么例子?
【问题讨论】:
-
有一个指针指向UB。
-
不,这是不合法的。即使它应该工作。
-
因为它在比较或减法方面可能表现不佳。例如
(p + 2000000000) - p可能不等于 2000000000。 -
@RaymondChen - 在这个例子中,除了赋值和限定解引用之外什么都没有 - 该值仅在验证后使用,问题是为什么值的设置有问题?
-
是否只是有一个指向未定义数组末尾 2 的指针,而没有取消引用或添加它?