我遇到了一个非常奇怪的错误,其中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之间的某种联系吗?我很困惑......
答案 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)。除了这些界限之外的任何东西,嗯,你看到会发生什么。