在获取字符串输入

时间:2016-12-17 11:04:46

标签: c++ arrays buffer buffer-overflow

#include <iostream>
#include <math.h>
using namespace std;

int main()
{
    long int m,i;
    cin>>m;
    float first=0,second=0,disp=0;
    int arr[m];
    char ch[m];
    for(i=0;i<m;i++)
    {
    cin>>arr[i];
    }
    cout<<" before="<<arr[0]<<endl;
    cin>>ch;
    cout<<" after="<<arr[0]<<endl;
    //puts(ch);
    return 0;
}

首先我在一个数组中插入元素然后在我接受字符串输入后打印数组的第0个索引。突然发生了什么!我的第0个数组索引发生了变化!!! 怎么可能,有人愿意解释这个

output of a program in c++

arr[0]的值变了,为什么?

2 个答案:

答案 0 :(得分:2)

问题是您为cin >> ch;输入了太多字符。自m == 40起,您将其声明为char ch[40]。这允许您输入39个字符(因为尾随'\0'字符而不是40个字符),但是您输入的内容远不止于此,因此它在数组边界外写入,这会导致未定义的行为。在这种情况下,它溢出到arr数组。

我建议你使用std::string而不是char数组,然后它会自动扩展到合适的大小。

答案 1 :(得分:1)

您偶然发现缓冲区溢出。维基百科有一个基本的例子,以及关于这个主题的更多细节。 (Read more

当你超出 ch 数组的边界并写入相邻的内存位置(在这种情况下恰好是 arr 数组)时会发生这种情况。