当该数组的索引中没有元素时,指针指向什么?
What is pointer pointing to when there's no element in that array's index?
我创建了一个数组
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意味着任何事情都可能发生。在您的情况下,一些值已打印到屏幕上,但不能保证会发生这种情况。
相关文章:
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 初始化或分配空字符串文字到指向 C 中的 char 的指针或指向 C++ 中 const char 的指针的原因是什么
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 使用基类指针调用基类的值构造函数的语法是什么?
- 将指针分配给另一个指针时会发生什么情况?
- 当该数组的索引中没有元素时,指针指向什么?
- C++:Lambda 函数指针转换的用例是什么?
- C++关于指针和使用函数将它们启动到堆的行为究竟是什么?
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- 什么是更好的做法?通过指针或标识符传递类成员?
- 如果我在 const 函数上使用指针,我可以返回什么?
- 为什么此指针值不能转换为整数的规则是什么?
- 在自定义 std::vector-like 容器中处理指针和非指针模板类型的最佳方法是什么?
- 在什么情况下,需要共享智能指针而无法使用唯一指针?
- 以下与指针相关的代码的输出是什么?
- 指向数组基址的指针而不是指向第一个元素的指针有什么优点?
- C++中的指针.什么类型的对象