新运算符分配的大小比声明的大。为什么

时间:2018-07-01 04:15:41

标签: c++

我正在使用代码块16.01。在下面给出的代码中,我使用了new运算符并声明了数组指针。

#include <iostream> 
using namespace std;
int main()
{
 int *p = new int[2];
 for(int i=0; i<10;i++)
 {   
     cout<<"\n Enter the element  "<<i << " :  ";
     cin>>*(p+i);
 }
 for(int i=0; i<10;i++)
   cout<<"\n"<<*(p+i)<<" :  "<< i << "th element ";
 }

这就是我怀疑的图像the size declared is 2 but the array is able to store for 7 elements also why is this happening ??. Even I tried to increase the size to 5 then also it took and stored 7 elements value but rest it gave the address. Why ?

3 个答案:

答案 0 :(得分:2)

C ++数组元素引用不会自动检查数组范围。

可以经常引用超出分配给数组的大小,但是您不应该。在分配的阵列之外,存储器可以位于其他位置。

有些工具例如valgrind可以检测您的程序,以检测越界访问和其他有问题的操作。他们可以很有趣地进行试验。

答案 1 :(得分:1)

访问超出数组末尾的行为是C ++标准未定义的行为。作为程序员,您的工作就是确保永远不会发生。

如果确实发生了,那么有效的C ++程序可以执行任何操作而不会违反C ++标准;它可以格式化硬盘,通过电子邮件将浏览器历史记录和信用卡号发送给南极洲,甚至是旅行。有趣的是,最后一个不是玩笑。

在实践中,C ++编译器在操作系统提供的基于幼稚页面的内存提供程序的基础上,在硬件上实现抽象机。 C / C ++运行时管理一个内存堆,在其中将OS提供的页面切成所需的内存块。这意味着您的进程拥有new返回的大多数地址周围的地址空间;返回的块周围的数据经常包含C / C ++运行时的布尔信息,用于地址回收。

通过在此处写入,您正在覆盖程序存储空间中的某些其他数据结构,或者使用了您并未声称要写入的存储器。在更大的程序中,这将很可靠地导致堆损坏,并在代码的意外的和看似无关的部分出现看似随机的崩溃。在您的玩具程序中,没有使用您损坏的内存,因此没有出现明显的症状,并且它“似乎可以正常工作”。欢迎来到不确定的行为。

所有这些都是为什么(至少在某些情况下)使用new / malloc和指针算术“原始”而不是一个好主意,而是将其打扮成一个好主意的原因导致您不太可能导致堆损坏的模式。类似std::vector和基于范围的for循环之类的东西。 C / C ++程序员未能将内存访问控制在控制范围内,这激怒了数十种非常成功且缓慢的语言,这些语言的主要优点是访问无效指针并不是不确定的行为。

答案 2 :(得分:0)

您为2个整数保留了空间。用指针指向RAM中的“某处”。前两个访问命中int数组。最后8次访问仅写在某个地方。 因此,这是一个典型的c问题。在数组外编写,破坏一些数据并且不注意...