2

首先,我是 C++ 编程的初学者。昨天我遇到了一件很奇怪的事情。我试图通过指向它的指针来确定数组的长度。由于sizeof不起作用,我做了一点谷歌搜索,最后在这个网站上找到了不可能的答案。相反,我应该在数组的最后一个索引处放置一个超出界限的值,并增加一个计数器,直到达到这个索引。因为我不想覆盖最后一个索引中包含的信息,所以我尝试将超出界限的值放在最后一个索引之后。我预计它会失败,但由于某种原因它没有。

我认为我在其他地方犯了一个错误,并且数组比我分配的要长,所以我做了以下测试:

int a[4];
a[20] = 42;
std::cout << a[20];

输出为 42,没有任何错误。为什么这行得通?这根本不应该有效,对吧?更有趣的是它适用于任何原始类型数组。但是,一旦我使用 std::string 程序立即以 1 存在。

有任何想法吗?

4

2 回答 2

6

您的系统恰好没有使用恰好是20 * sizeof(int)距数组地址更远的字节的内存。(从一开始。)或者内存属于你的进程,因此你可以弄乱它,要么自己破坏一些东西,要么只是幸运的巧合什么都不破坏。

底线,不要那样做:)

于 2012-05-13T12:45:22.773 回答
0

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

于 2012-05-13T13:07:12.003 回答