操作二维整数数组时堆栈溢出 我编写了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
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++在调用递归之前,code>到。@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