首先,我是C ++编程的初学者。昨天我遇到了一些比较奇怪的事情。我试图通过指向它的指针来确定数组的长度。由于 sizeof 不起作用,我做了一点谷歌搜索,最后在这个网站上我找到了答案,这是不可能的。相反,我应该在数组的最后一个索引处放置一个超出值的值,并递增计数器,直到达到此索引。因为我不想覆盖最后一个索引中包含的信息,所以我尝试将最后一个索引放在一个索引之后。我预计它会失败,但由于某些原因它没有。
我以为我在其他地方犯了一个错误,那个数组比我指定的要长,所以我做了以下测试:
int a[4];
a[20] = 42;
std::cout << a[20];
输出为42,没有任何错误。为什么这样做?这根本不应该有效,对吧?更有趣的是,这适用于任何基本类型数组。但是,一旦我使用std :: string,程序立即存在1。
有什么想法吗?
答案 0 :(得分:6)
您的系统恰好没有使用恰好距离阵列地址20 * sizeof(int)
字节的内存。 (从一开始。)或者记忆属于你的过程,因此你可以搞砸它,或者为自己打破一些东西,或者只是通过幸运巧合打破任何东西。
底线,不要那样做:)
答案 1 :(得分:0)
我认为您需要了解的内容如下:
当您创建a[4]
时,编译器会为4个整数分配内存,并在a
中记住第一个的地址:(*a == &(a[0])
)。
当你读到\ write时,编译器不会检查你是否在界限内(因为他不再拥有这些信息)。然后按以下方式转到所请求的数组单元格的地址:a[X] == &(a + sizeof(int) * X)
在C ++中,程序员有责任在访问数组时检查边界。