受std :: cin影响的矢量大小?

时间:2014-03-02 06:51:01

标签: c++ vector stl cin

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

int main()
{
    std::vector<int> asdf;
    asdf.push_back(1);
    asdf.push_back(42);

    printf("Size: %d\n",asdf.size());   //prints 2...

    char buffer[4];
    printf("Input 4 random characters:");
    std::cin >> buffer;

    printf("\n%d\n",asdf.size());     //prints 32???
}

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

3 个答案:

答案 0 :(得分:4)

你需要4个字符和一个NULL字符,但是你有一个包含4个字符的数组。因此,将数组更改为char buffer[5];

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

与其他语言不同,C ++并不会警告您已经超越了其他语言。而是将角色放置在各自的位置,就好像阵列是无限的一样。是的,你声明了一个4的数组,但是4只告诉你有效或安全的条目(索引从0到3)。除了这些界限之外的任何东西,嗯,你看到会发生什么。