我在堆上声明了一个像这样的整数数组
int* a = new int[100];
然后我像这样初始化它
for(int i=0; i<100; i++)
a[i] = i;
效果很好,但后来我尝试了这个
for(int i=0; i<1000; i++)
a[i] = i;
这也很完美。因为我是c ++的新手,任何人都可以解释上面这个声明中的问题,因为我认为整数数组的声明不正确或者可能是其他什么?
答案 0 :(得分:2)
当您在数组末尾写入时,您会得到未定义的行为。重要的词是 undefined 。它可能取决于编译器,环境,编译器标志,......
在你的例子中它起作用是因为你在一个可访问的内存上写了,但你可以(非限制性列表):
但由于它是未定义的行为,没有什么能保证会发生这种情况。您只知道必须从不这样做。
最近(体面的操作系统)你不能崩溃系统,但只有你自己的应用程序,除非你运行管理员或root权限,在什么情况下会发生任何事情。但是对于像MS / DOS(或某些嵌入式系统)这样的旧系统,没有应用程序间保护,这样的程序可能会发生系统崩溃。
答案 1 :(得分:1)
您在堆上创建了一个100 ints
数组。但是你正在访问记忆。 C ++并没有阻止你这样做,但它是一个未定义的行为,你可能会遇到崩溃,其他程序使用的内存损坏等。
答案 2 :(得分:0)
您将变量声明为100.但是您要将值分配为1000。
int* a = new int[100];
将其设为1000。
编辑:
如果您正在访问未为该变量声明的内存,则会出现分段错误。有些时候只有它才能正常工作。
答案 3 :(得分:0)
你只是分配一些内存,即使你没有权限。它可以工作。但是,我确信,程序本身会在某些时候中断。
答案 4 :(得分:0)
C和c ++不检查那种溢出。你应该永远不会让这种情况发生。毋庸置疑,这是C和C ++因无情而闻名的原因的1/2。
你很幸运,程序没有暴力崩溃。但它很快就会被其他记忆粉碎。
答案 5 :(得分:0)
从技术上讲,“a”只是一个指针(如你所声明的那样)。
然后你已经指出某个数组的开始(在这种情况下在堆上)。
然后您正在递增指针并设置值。编译器根本不会有这个问题,因为“a”不是数组,而是指向编译器被告知的内存位的指针是一个整数。所以你可以让你的循环继续,只要你想要,但它将开始覆盖用于其他目的的内存,可能最终在途中某处出现seg故障......或者其他一些奇怪的行为:o