操作二维整数数组时堆栈溢出 我编写了C++程序,用选择排序对整数矩阵进行排序。我试着编译并运行这个程序。但是我遇到了一个堆栈溢出错误,消息中还提到了访问冲突写入位置

操作二维整数数组时堆栈溢出 我编写了C++程序,用选择排序对整数矩阵进行排序。我试着编译并运行这个程序。但是我遇到了一个堆栈溢出错误,消息中还提到了访问冲突写入位置,c++,visual-studio,c++17,C++,Visual Studio,C++17,我尝试了以下步骤: 尝试将阵列大小从50 x 50减小到10 x 10 已尝试将堆分配到结果数组(使用new) 尝试将结果数组声明为静态数组 尝试在调试菜单中检查该特定内存的内存选项 位置(但无法理解) 尝试检查IDE自动打开的chkstk.asm文件 但所有这些努力都没有用 这是运行时错误中涉及的源代码部分 void SelectionSort(int matrix[][10], int rowMax, int colMax) { //Runtime error was pointed

我尝试了以下步骤:

  • 尝试将阵列大小从50 x 50减小到10 x 10
  • 已尝试将堆分配到结果数组(使用new)
  • 尝试将结果数组声明为静态数组
  • 尝试在调试菜单中检查该特定内存的内存选项 位置(但无法理解)
  • 尝试检查IDE自动打开的chkstk.asm文件
  • 但所有这些努力都没有用

    这是运行时错误中涉及的源代码部分

    void SelectionSort(int matrix[][10], int rowMax, int colMax)
    {
        //Runtime error was pointed over here.
    
        int smallest, temp, position, count = 0;
        int resultant[10][10];
    
        for (int row = 0; row < rowMax; row++)
        {
            for (int j = 0; j < rowMax - 1; j++)
            {
                smallest = matrix[row][j];
                position = j;
    
                for (int k = j + 1; k < rowMax; k++)
                {
                    if (matrix[row][k] < smallest)
                    {
                        smallest = matrix[row][k];
                        position = k;
                    }
                }
                temp = matrix[row][j];
                matrix[row][j] = matrix[row][position];
                matrix[row][position] = temp;
            }
    
        }
        for (int i = 0; i < rowMax; i++)
            for (int j = 0; j < colMax; j++)
                resultant[i][j] = matrix[j][i];
    
        if (count == 0)
        {
            SelectionSort(resultant, rowMax, colMax);
            count++;
        }
    
        else
        {
            std::cout << "The sorted matrix is: " << std::endl;
            for (int i = 0; i < rowMax; i++)
            {
                for (int j = 0; j < colMax; j++)
                {
                    std::cout << matrix[i][j] << "  ";
                }
                std::cout << "\n";
                    }
            }
    }  
    

    我希望排序后的矩阵能在控制台中打印出来

    例如,如果未排序的矩阵为:
    1.95
    836
    7 4 2

    那么输出应该是:
    1 2 3
    4.56
    7 8 9

    <>我请求你不要发送复杂的模板建议,因为我处于C++编程的中间层。


    提前谢谢

    count
    初始化为0,如果(count==0),则在
    之前不会更改,因此测试将始终为真。代码将从
    SelectionSort
    内部无限调用
    SelectionSort
    ,直至堆栈溢出。选择排序不需要是递归的;只要写一个循环,重复直到没有交换。你能建议一个更好的替代方案吗?(我想先对矩阵按行排序,然后对它进行转置,然后再按行排序。)哦,我明白了,‘resultant’是转置。无论如何,循环几乎总是比递归好。所以你想做两次传递,对数组排序,对它进行转置,然后对转置进行排序
    对于(int count=0;;++count){/*对数组进行排序*/if(count==1)break;/*对数组进行转置*/}
    如果您确定递归逻辑良好,可以尝试更改变量
    count
    声明以添加
    静态
    -这样所有递归和移动
    count++到。@HelloEveryone Plus我将测量排序所需的时间。
    count
    被初始化为0,并且在
    之前没有更改,如果(count==0)
    ,那么测试将始终为真。代码将从
    SelectionSort
    内部无限调用
    SelectionSort
    ,直至堆栈溢出。选择排序不需要是递归的;只要写一个循环,重复直到没有交换。你能建议一个更好的替代方案吗?(我想先对矩阵按行排序,然后对它进行转置,然后再按行排序。)哦,我明白了,‘resultant’是转置。无论如何,循环几乎总是比递归好。所以你想做两次传递,对数组排序,对它进行转置,然后对转置进行排序
    对于(int count=0;;++count){/*对数组进行排序*/if(count==1)break;/*对数组进行转置*/}
    如果您确定递归逻辑良好,可以尝试更改变量
    count
    声明以添加
    静态
    -这样所有递归和移动
    count++到递归调用之前。@HelloEveryone加上我将测量排序所需的时间。
    
    Exception thrown at 0x00007FF79D763488 in Sorting Algorithm Benchmarking Program.exe: 0xC0000005: Access violation writing location 0x000000BFBF600000. occurred
    
    Unhandled exception at 0x00007FF79D763488 in Sorting Algorithm Benchmarking Program.exe: 0xC00000FD: Stack overflow (parameters: 0x0000000000000001, 0x00000058CE0B3000). occurred