C++:写入/读取无效/出界数组索引?

eet 发布于 4 天前 arrays 最后更新 4 天前 11 浏览

首先,当谈到C++编程时,我是一名初学者。昨天我遇到了一些相当奇怪的事情。我试图通过指向它的指针来确定数组的长度。由于sizeof没有工作,我做了一点谷歌搜索,最终在这个网站上,我发现答案是不可能的。相反,我应该在数组的最后一个索引处放置一个超出限制的值,并增加一个计数器,直到达到该索引。因为我不想覆盖最后一个索引中包含的信息,所以我试图在最后一个索引之后放置超出限制值的索引。我预计它会失败,但由于某种原因它没有。 我以为我在其他地方犯了一个错误,而且阵列比我分配的时间长,所以我做了以下测试:

int a[4];
a[20] = 42;
std::cout << a[20];
输出是42,没有任何错误。为什么这个工作?这应该不是有效的,对吧?更有意思的是,它可以处理任何原始类型的数组。但是,一旦我使用std :: string,程序立即存在1。 有任何想法吗?
已邀请:

hquia

赞同来自:

您的系统恰好没有使用恰好是数组地址的20 * sizeof(int)字节的内存。 (从一开始。)或者记忆属于你的过程,因此你可以搞乱它,或者为自己打破一些东西,或者只是通过幸运的巧合打破任何东西。 底线,不要那样做:)

oqui

赞同来自:

我认为您需要了解的内容如下:
当您创建a[4]时,编译器为4个整数分配内存,并在a中记住第一个的地址:(a == &(a[0]))。
当你读到\ write时,编译器不会检查你是否在界限内(因为他不再拥有这些信息)。然后按以下方式转到所请求的数组单元格的地址:a[X] == &(a + sizeof(int)
X)
在C++中,程序员有责任在访问数组时检查边界。

要回复问题请先登录注册