为什么cpp允许访问我尚未分配的内存?

时间:2015-07-04 12:30:36

标签: c++ arrays dynamic-memory-allocation static-memory-allocation

在cpp中,可以使用数组声明 typename array [size]; 要么 typename * array = new typename [size]; 阵列长度大小'和元素的索引来自' 0'到'大小-1' 我的问题是,我可以访问索引> = size。

之外的元素

所以我写了这个小代码来检查它

#include <iostream>
using namespace std;

int main()
{
    //int *c;                    //for dynamic allocation
    int n;                       //length of the array c
    cin>>n;                      //getting the length
    //c = new int[n];            //for dynamic allocation
    int c[n];                    //for static allocation

    for(int i=0; i<n; i++)       //getting the elements
        cin>>c[i];

    for(int i=0; i<n+10; i++)    //showing the elements, I have add up 10
        cout<<c[i]<<" ";         //with size to access the memory I haven't
                                 //allocated for
    return 0;
}

结果就像这样

2
1 2
1 2 2686612 1970422009 7081064 4199040 2686592 0 1 1970387429 1971087432 2686700

该程序不应该崩溃但是会给出垃圾值。对于两种分配方法,它都给出了相同的结果。它会产生更多难以察觉的错误。它与我正在使用的环境或编译器或其他任何东西有关吗?

我在Windows 8.1上使用的是具有TDM-GCC 4.8.1编译器的codeblocks IDE

提前致谢。

2 个答案:

答案 0 :(得分:1)

这称为&#34;未定义的行为&#34;在C ++标准中。

未定义的行为可能意味着以下任何一种行为:

  • 程序崩溃

  • 程序继续运行,但产生无意义的垃圾结果

  • 程序继续运行,并自动复制硬盘的全部内容,并在Facebook上发布

  • 该计划继续运行,并自动订阅发布商信息交换机构抽奖活动

  • 程序继续运行,但您的计算机着火并爆炸​​

  • 该程序继续运行,让您的计算机自我感知,自动链接和网络与其他自我感知网络,形成天网,并摧毁人类

结论:不要运行和访问数组末尾的元素。

答案 1 :(得分:0)

c ++编译器不执行此操作,因为没有规范要这样做。

访问数组的元素时,没有进行边界检查。 c[i]只会被翻译为c + i * sizeof(int)而且就是segmentation fault。如果内存区域没有初始化,那么你会得到垃圾,但是你可能会得到其他有用的信息,这一切都取决于那里有什么。

请注意,根据您运行的操作系统和c ++运行时,您可以获得不同的结果,例如在Linux机器上,您可能会获得compile 'com.google.android.gms:play-services:+' compile files('libs/google-play-services.jar') compile files('libs/libGoogleAnalyticsServices.jar') compile files('libs/gcm.jar') ,程序将会崩溃。