-2

在 cpp 中,可以使用数组声明作为 typename array[size]; typename *array = new typename[size]; 其中数组的长度为“大小”,元素的索引从“0”到“大小-1”这里我的问题是我是否允许访问索引> =大小之外的元素。

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

#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 编译器的代码块 IDE

提前致谢。

4

2 回答 2

1

这在 C++ 标准中称为“未定义行为”。

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

  • 程序崩溃

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

  • 该程序继续运行,并自动复制您硬盘的全部内容,并将其发布到 Facebook

  • 该程序继续运行,并自动为您订阅 Publishers Clearinghouse Sweepstakes

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

  • 程序继续运行,让你的电脑有自我意识,它会自动与其他有自我意识的网络链接和联网,形成天网,毁灭人类

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

于 2015-07-04T12:40:23.913 回答
0

c++ 编译器不强制执行此操作,因为没有规范执行此操作。

当您访问数组的元素时,不会进行边界检查。c[i]只是被翻译成c + i * sizeof(int),就是这样。如果该内存区域未初始化,您将得到垃圾,但您可能会获得其他有用的信息,这完全取决于那里的内容。

请注意,根据您运行的操作系统和 c++ 运行时,您可能会得到不同的结果,例如在 linux 机器上,您可能会得到 asegmentation fault并且程序会崩溃。

于 2015-07-04T12:41:43.227 回答