C ++访问静态数组和新数组之外的边界?

时间:2011-12-15 18:40:28

标签: c++ arrays dynamic size new-operator

为什么以下代码会编译并运行。

我创建了一个整数数组,并将其大小分配给10,为什么程序在for循环内部时没有返回我试图访问数组外部元素的错误?

另外,我想了解new的概念,是我的用法正确(我没有分配多少内存*数组需要),我的理解是new允许我创建一个动态大小的数组(意思是我可以在运行时无限期地增加这个数组的大小,如果我错了,请纠正我)。如果这是正确的,那么使用new或仅仅分配array []会有什么不同;因为这两个显然允许我在运行时增加我的数组的大小,这可以通过这个例子看到。我知道范围,堆栈和堆差异,因此假设两个变量仅在main中声明,并使用以下代码作为示例。

http://ideone.com/Tbud1

#include <iostream>
using namespace std;

int main()
{
int array[10];
int *arrays;
arrays = new int();
for (int i=0; i<450; i++)
{
   arrays[i] = i;
   cout << arrays[i] << " ";
   array[i] = i;
   cout << array[i] << endl;
}
return 0;
}

1 个答案:

答案 0 :(得分:3)

访问超出数组范围的元素会导致未定义的行为 编译器不需要在这种保证的Undefine Behavior情况下做任何特定的事情 可能发生任何事情,您的程序可能会崩溃或不显示或显示不稳定的行为,标准允许这样做。

参考:

C ++标准第1.3.24节声明:

  

允许的未定义行为包括完全忽略不可预测的结果,在翻译或程序执行期间以环境特征(有或没有发出诊断消息)的文件化方式行事,终止翻译或执行(发布诊断信息)。

您对new的理解不正确。 new允许您在freestore(a.k.a堆​​)上分配固定数量的内存。如果扩展已分配内存的边界,则不会分配额外的内存。您需要确保必须分配足够的内存,以免超出界限。

在你的程序中,你试图分配相当于10个数组元素的内存,所以你应该这样做:

arrays = new int[10];

另外,一旦完成使用分配的内存,请不要忘记调用delete[],否则会导致内存泄漏。

delete []arrays;

如果您需要根据您的使用情况自动增加的数据结构,C ++会以 std::vector 的形式提供。