矢量大小受 std::cin 影响

Vector size affected by std::cin?

本文关键字:cin 影响 std      更新时间:2023-10-16

我遇到了一个非常奇怪的错误,其中std::vector的大小在收到std::cin输入后发生变化。我已经隔离了问题,但我不明白为什么会发生这种情况:

int main()
{
    std::vector<int> asdf;
    asdf.push_back(1);
    asdf.push_back(42);
    printf("Size: %dn",asdf.size());   //prints 2...
    char buffer[4];
    printf("Input 4 random characters:");
    std::cin >> buffer;
    printf("n%dn",asdf.size());     //prints 32???
}

当我std::cin >> buffer;评论时,错误没有发生。谁能说明为什么会这样?这是由于矢量和iostream之间的某种联系吗?我很困惑...

您需要 4 个字符,并在它们后面加上一个NULL字符,但您有一个包含 4 个字符的数组。因此,将数组更改为char buffer[5];

为什么会出现此问题?输入 4 个字符后,它会将它们放入 buffer[0]buffer[1]buffer[2]buffer[3] 中,最后它会在 buffer[4] 中放入一个NULL。但是你没有buffer[4]的位置,所以它将被写入与向量实例相关的空间中。这会更改您的向量。你的堆栈内存是这样的:

| ... Vector Instance Memory... | buffer[3] | buffer[2] | buffer[1] | buffer[0] |
                               ^this is the place where buffer[4] refers to

buffer 中的最后一个字符保留给 。因此,如果您输入 4 char秒,则最后一个char将超出buffer的保留空间,这可能会被asdf使用。所以基本上它覆盖了asdf的一部分。

您遇到的称为缓冲区溢出。 您为 x 个字符保留了空间,但在那里放置了 x+1 个字符。

与其他语言不同,C++不会警告您已经越过了边缘。 相反,字符被放置在各自的位置,就好像数组是无限的一样。 是的,您声明了一个 4 的数组,但该 4 只告诉您有效或安全的条目(索引从 0 到 3)。 任何超出这些界限的事情,好吧,你看看会发生什么。