-1

我创建了一个数组

int A[5] = {2,4,6,8,10};

并做了两个指针

int *p=A, *q=&A[5];

因为数组中只有五个元素,据我在 C++ 中的理解,当什么都没有时它应该为零。

当我尝试打印时

cout<<"*p = "<<*p<<endl;
cout<<"*q = "<<*q<<endl;

我得到了这个

*p = 2
*q = 32766

我可能对指针p有误,它默认指向第一个元素。

但我不明白为什么在指针q中打印出如此巨大的值,即使它甚至不是堆中的内存地址。

有人可以向我解释发生了什么吗?

4

2 回答 2

3

据我在 c++ 中的理解,当什么都没有时,它应该是零。

你误会了。

cout<<"*q = "<<*q<<endl;

在这里,您通过指向数组边界之外的指针进行间接访问,并尝试访问不存在的元素。程序的行为是未定义的。

有人可以向我解释吗?

程序的行为未定义。行为可以是任何东西。这次您观察了32766. 这是程序可以具有的所有行为中的一种可能行为。

应避免未定义的行为。

于 2020-06-26T16:32:33.957 回答
2

A[5]仅包含 5 个元素,因此唯一有效的索引是 0 到 4。

因此,您可以参考以下地址A[5]

int *q = A + 5;  // fine

此地址未指向有效内存,取消引用此地址会调用未定义的行为。

cout << *q; // ub

另请注意:

int *q = &A[5];  // ub

也是 UB,因为右侧变成&(A[5]),但A[5]立即调用 UB。

UB 意味着任何事情都可能发生。在您的情况下,某些值已打印到屏幕上,但不能保证会发生这种情况。

于 2020-06-26T16:31:32.757 回答