使用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流在第一次读取失败后将进入失败状态,需要在读取更多值之前重置