C++ 动态数组 - 为啥我能做到这一点? [复制]

Posted

技术标签:

【中文标题】C++ 动态数组 - 为啥我能做到这一点? [复制]【英文标题】:C++ Dynamic Arrays - Why am I able to do this? [duplicate]C++ 动态数组 - 为什么我能做到这一点? [复制] 【发布时间】:2016-05-30 20:11:40 【问题描述】:

我试图在我的项目中使用动态数组,但我不明白为什么我可以这样做:

int *a;
a = new int[1];
a[100]=2;

cout << a[100] << endl;

我的意思是,我创建了可以存储 1 个元素的数组“a”,那么为什么我可以使用数组的第 100 个元素呢?它不应该存在,不是吗?

【问题讨论】:

同样的原因,你可以在篮球比赛中捡起球然后跑掉,即使“在篮球比赛中你不能拿着球跑”。 因为你被允许做那些不起作用的事情。你正在访问你不应该访问的内存——所有的赌注都被取消了——它看起来似乎有效,但实际上并没有。 @KerrekSB 辉煌。 :-) No out of bounds error 的可能重复项也类似:***.com/questions/1239938/… @KerrekSB 我喜欢这个——“我的驾照被吊销了,但是为什么我还能开车去开车呢?” 【参考方案1】:

一些基本的东西: 您的数组存储在内存中,每个单元格都有自己的地址。数组名称a 指向内存中它开始的位置。从那里a[0]a[1] 或只是 a[index] 与您键入*(a+index) 相同 - 它获取/设置位于内存中 (a+index) 索引下的值.

事实上,您可以覆盖这些地址中的任何一个,即使它们没有被您的变量(数组等)使用。当然你不应该这样做,但你的编译器不会生气(你也可以声明变长数组,编译器可能不在乎,但你应该意识到这一点)。

我尽量让它简单,我相信没有必要详细说明。

【讨论】:

以上是关于C++ 动态数组 - 为啥我能做到这一点? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中找到数组的确切大小? [复制]

如何动态地将大小分配给 C++ 中的数组?

如何获取数组的大小? [复制]

为啥必须动态分配扩展数组才能使此函数正常工作 C++

动态数组 C++,新 Obj[size] 的麻烦只创建 1 个对象指针,而不是数组

为啥我的动态数组可以在不调整大小的情况下工作? [复制]