当该数组的索引中没有元素时,指针指向什么?

What is pointer pointing to when there's no element in that array's index?

本文关键字:指针 什么 元素 数组 索引      更新时间:2023-10-16

我创建了一个数组

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中打印如此巨大的值,即使它甚至不是堆中的内存地址。

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

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

你误会了。

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

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

有人可以向我解释一下吗?

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

应避免未定义的行为。

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意味着任何事情都可能发生。在您的情况下,一些值已打印到屏幕上,但不能保证会发生这种情况。

相关文章: