在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
提前致谢。
答案 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')
,程序将会崩溃。