接受字符串输入后,数组的值会自动更改
values of array gets changed automatically after taking string input
#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 个索引变了!!!
怎么可能,有人愿意解释一下吗
arr[0]
的值已更改,为什么?
问题是您为 cin >> ch;
输入了太多字符。由于 m == 40
,您将其声明为 char ch[40]
。这允许您输入 39 个字符(不是 40 个,因为尾随 '[=13=]'
字符),但您输入的比这多得多,所以它写在数组边界之外,这导致未定义的行为。在这种情况下,它溢出到 arr
数组中。
我建议你使用 std::string
而不是 char
数组,这样它会自动扩展到合适的大小。
您偶然发现了缓冲区溢出。维基百科有一个基本示例,以及有关此主题的更多详细信息。 (Read more)
当你越过 ch 数组的边界并写入它的相邻内存位置(在本例中恰好是 arr 数组).
#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 个索引变了!!! 怎么可能,有人愿意解释一下吗
arr[0]
的值已更改,为什么?
问题是您为 cin >> ch;
输入了太多字符。由于 m == 40
,您将其声明为 char ch[40]
。这允许您输入 39 个字符(不是 40 个,因为尾随 '[=13=]'
字符),但您输入的比这多得多,所以它写在数组边界之外,这导致未定义的行为。在这种情况下,它溢出到 arr
数组中。
我建议你使用 std::string
而不是 char
数组,这样它会自动扩展到合适的大小。
您偶然发现了缓冲区溢出。维基百科有一个基本示例,以及有关此主题的更多详细信息。 (Read more)
当你越过 ch 数组的边界并写入它的相邻内存位置(在本例中恰好是 arr 数组).