You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过转置判断矩阵是否对称的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 20:40:57