通过转置判断矩阵是否对称的C++程序问题排查求助
问题分析与修正
你的代码存在多个关键错误,导致程序无法正常运行,逐个拆解如下:
1. 指针越界访问,比较时读取无效内存
第一个循环生成转置矩阵的过程中,ptr被逐步递增到原数组的末尾(初始指向原数组首元素,循环r*c次后,ptr指向原数组最后一个元素的下一个位置)。第二个循环再用这个ptr取值比较,属于越界访问,读取的是随机垃圾值,必然导致判断错误。
解决方法:需要保存原数组的起始指针,或者重新从原数组开头开始遍历比较。
2. 变量未初始化,存在未定义行为
bool symmetrisch;没有初始值,若所有元素都相等,第一个if会赋值为true,但如果循环未执行(比如groesse=0),返回的是未定义的垃圾值,程序行为不可预测。
解决方法:初始化为true,因为只要有一个元素不相等才需要设为false。
3. 输出逻辑颠倒且重复
main函数中,当trans为true(矩阵对称)时,输出的却是“the matrix is not symmetric”,且两个if分支输出内容完全一致,逻辑完全错误。
4. 输入数组时索引错误
你定义的数组是int array[c][r];(列数为c,行数为r),但输入循环中用array[j][i]赋值,其中i是行索引(0到r-1),j是列索引(0到c-1),这会导致数组存储顺序混乱,应该改为array[i][j]。
5. 使用非标准的变长数组(VLA)
int array_neu[r][c];和int array[c][r];属于变长数组,这是C99的特性,C++标准并不支持,仅部分编译器(如GCC)作为扩展支持,可移植性极差。建议改用动态分配内存或vector容器。
修正后的代码
#include <iostream> #include <vector> using namespace std; bool transponierte(const int* original, int size, int cols, int rows) { // 用vector替代变长数组,符合C++标准 vector<vector<int>> transposed(rows, vector<int>(cols)); const int* ptr = original; // 生成转置矩阵,使用新指针遍历原数组,不修改传入的起始指针 for (int i = 0; i < cols; ++i) { for (int j = 0; j < rows; ++j) { transposed[j][i] = *ptr; ptr++; } } // 从原数组开头开始比较 const int* ptr_orig = original; const int* ptr_trans = &transposed[0][0]; bool is_symmetric = true; // 初始化为true for (int i = 0; i < size; ++i) { if (*ptr_orig != *ptr_trans) { is_symmetric = false; break; } ptr_orig++; ptr_trans++; } return is_symmetric; } int main() { int rows, cols; cout << "输入列数: " << endl; cin >> cols; cout << "输入行数: " << endl; cin >> rows; // 用vector存储原数组,避免变长数组问题 vector<vector<int>> matrix(rows, vector<int>(cols)); int size = rows * cols; for (int i = 0; i < rows; ++i) { for (int j = 0; j < cols; ++j) { cout << "输入矩阵元素 [" << i << "][" << j << "]: " << endl; cin >> matrix[i][j]; } } bool symmetric = transponierte(&matrix[0][0], size, cols, rows); if (symmetric) { cout << "矩阵是对称的" << endl; } else { cout << "矩阵不是对称的" << endl; } return 0; }
额外说明(原生数组实现)
如果坚持使用指针和原生数组,可以用动态分配内存替代变长数组:
// 动态分配原数组 int* matrix = new int[rows * cols]; // 行优先存储输入元素 for (int i = 0; i < rows; ++i) { for (int j = 0; j < cols; ++j) { cin >> matrix[i * cols + j]; } } // 动态分配转置矩阵 int* transposed = new int[rows * cols]; // 生成转置逻辑... // 使用完毕后释放内存 delete[] matrix; delete[] transposed;
内容的提问来源于stack exchange,提问作者Ramyz
相关产品推荐
相关产品推荐

