使用C++ STD::CIN时溢出错误,内部变量有奇数(C++ 11) 对于C++程序,我已经实现了2个函数: 将数组大小作为输入并创建该大小的1D数组的Make1DArray Make2DArray,获取行和列的大小,并创建给定行和列大小的二维数组
主要功能如下所示:使用C++ STD::CIN时溢出错误,内部变量有奇数(C++ 11) 对于C++程序,我已经实现了2个函数: 将数组大小作为输入并创建该大小的1D数组的Make1DArray Make2DArray,获取行和列的大小,并创建给定行和列大小的二维数组,c++,cin,C++,Cin,主要功能如下所示: int main() { cout << "enter 1d array length: "; int x; cin >> x; Make1DArray(x); cout << "enter 2d array row size: "; int nrows, ncols; cin >> nrows; cout <<
int main()
{
cout << "enter 1d array length: ";
int x;
cin >> x;
Make1DArray(x);
cout << "enter 2d array row size: ";
int nrows, ncols;
cin >> nrows;
cout << "enter 2d array col size: ";
cin >> ncols;
Make2DArray(nrows, ncols);
return 0;
}
enter 1d array length: 100000000000
enter 2d array row size: enter 2d array col size:
void Make1DArray(int arrSize) {
int *arr;
arr = (int *)malloc(arrSize * sizeof(int));
for (int i = 0; i < arrSize; i++)
{
arr[i] = i;
}
}
void Make2DArray(int nrows, int ncols) {
int **arr = (int **)malloc(nrows * sizeof(int *));
for (int i = 0; i < nrows; i++)
arr[i] = (int *)malloc(ncols * sizeof(int));
int count;
for (int i = 0; i < nrows; i++)
for (int j = 0; j < ncols; j++)
{
arr[i][j] = ++count;
}
}
所以我检查了x、nrow和ncol的值,这些值是:
x=2147483647
nrows=0
ncols=32767
我在谷歌上搜索了一下,发现当发生溢出错误时,cin会给x分配最接近的值。
对于nrows,我知道它可能会得到0,因为发生了错误
我不明白为什么第三个变量ncols被赋值为32767。我确实发现32767是短int的最大值,但我不知道为什么变量ncols会得到这个值
有人能给我解释一下吗?谢谢
埃塔:我不确定是否应该添加这两个函数,因为它们非常简单,但以防万一,它们看起来像这样:
int main()
{
cout << "enter 1d array length: ";
int x;
cin >> x;
Make1DArray(x);
cout << "enter 2d array row size: ";
int nrows, ncols;
cin >> nrows;
cout << "enter 2d array col size: ";
cin >> ncols;
Make2DArray(nrows, ncols);
return 0;
}
enter 1d array length: 100000000000
enter 2d array row size: enter 2d array col size:
void Make1DArray(int arrSize) {
int *arr;
arr = (int *)malloc(arrSize * sizeof(int));
for (int i = 0; i < arrSize; i++)
{
arr[i] = i;
}
}
void Make2DArray(int nrows, int ncols) {
int **arr = (int **)malloc(nrows * sizeof(int *));
for (int i = 0; i < nrows; i++)
arr[i] = (int *)malloc(ncols * sizeof(int));
int count;
for (int i = 0; i < nrows; i++)
for (int j = 0; j < ncols; j++)
{
arr[i][j] = ++count;
}
}
问题
问题是第一个溢出设置了由于值溢出而导致的故障位。不执行后续读数,使nrows和NCOL处于未定义状态。如果你初始化这些变量,你会注意到它们不会改变
解决方案
不要使用int来保存大小,而是使用size\u t。这应该适用于大多数编译器上的示例图
如果您希望您的代码是防弹的,请检查cin上的状态以查看输入是否有效,并在必要时处理任何错误,包括cin.clear以在恢复读取之前清除失败状态
不相关:顺便说一下,在泄漏内存的函数代码中,也要迭代大小。避免MALLC:C++中更喜欢动态创建对象。
问题
问题是第一个溢出设置了由于值溢出而导致的故障位。不执行后续读数,使nrows和NCOL处于未定义状态。如果你初始化这些变量,你会注意到它们不会改变
解决方案
不要使用int来保存大小,而是使用size\u t。这应该适用于大多数编译器上的示例图
如果您希望您的代码是防弹的,请检查cin上的状态以查看输入是否有效,并在必要时处理任何错误,包括cin.clear以在恢复读取之前清除失败状态
不相关:顺便说一下,在泄漏内存的函数代码中,也要迭代大小。避免MALLC:C++中更喜欢动态创建对象。
在中国>>ncols的好日子;读取失败不会改变ncols的值,因为ncols还没有初始化,所以您得到的是您得到的,不能依靠押韵或推理。为什么NCOLS失败了?……C++的哪一个版本?正如USER45 81301所示的,这是用C++ 11改变的规则。我认为C++中的Maloc保留了真正奇怪的边缘情况,而当你为其他程序构建低级构建块时。更喜欢使用新的,因为它为你做的更多,更难搞砸。也就是说,比起new,您更喜欢std::vector这样的库容器。一般建议:每次执行IO事务时,都要先测试流,然后再测试任何假定事务工作的内容。类似于if cin>>x{use x}else{clean up stream}。cin流在第一次读取失败后将进入失败状态,需要在cin>>ncols的好日子读取进一步的值之前重置;读取失败不会改变ncols的值,因为ncols还没有初始化,所以您得到的是您得到的,不能依靠押韵或推理。为什么NCOLS失败了?……C++的哪一个版本?正如USER45 81301所示的,这是用C++ 11改变的规则。我认为C++中的Maloc保留了真正奇怪的边缘情况,而当你为其他程序构建低级构建块时。更喜欢使用新的,因为它为你做的更多,更难搞砸。也就是说,比起new,您更喜欢std::vector这样的库容器。一般建议:每次执行IO事务时,都要先测试流,然后再测试任何假定事务工作的内容。类似于if cin>>x{use x}else{clean up stream}。cin流在第一次读取失败后将进入失败状态,需要在读取更多值之前重置