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

C++创建大尺寸二维动态数组时触发段错误(核心转储)问题排查

问题分析与修复方案

我帮你仔细排查了代码里的问题,导致段错误(尤其是矩阵尺寸超过7时崩溃)的原因主要有几个关键错误,我来逐个拆解并给出修复后的完整代码:

1. 全局变量未初始化就分配内存

你把m1c、m1r这些矩阵尺寸变量声明为全局变量,C++里全局int的默认初始值是0。这意味着你在main()函数执行前就已经运行了:

int** arr1 = new int*[m1c]; // m1c此时是0,分配了一个空的指针数组

等用户输入真实的矩阵尺寸后,arr1的大小还是0,后续循环给arr1[i]分配内存时,本质是在访问空数组的越界位置——小尺寸时可能刚好没踩到非法内存,尺寸变大后必然触发段错误。

2. 矩阵行和列的变量完全搞混

你输入时的变量命名完全颠倒了:

cout << "Enter the Number of rows for matrix 1 :"; 
cin >> m1c; // 把行数存在了带"c"(column)的变量里
cout << "Enter the Number of columns for matrix 1 :"; 
cin >> m1r; // 把列数存在了带"r"(row)的变量里

这种混乱导致后续数组分配、循环边界全部错误,进一步加剧了内存越界问题。

3. 提前释放数组且乘法逻辑缺失

你在还没执行矩阵乘法时就delete[] arr1; delete[] arr2;,而且用来存结果的multArr既没正确分配也没使用,完全没实现核心的乘法功能。

4. 其他小问题

  • rand()未初始化随机种子,每次运行生成的随机数完全相同;
  • 动态分配的内存未完整释放,存在内存泄漏。

修正后的完整代码

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std; 

int main(){ 
    int rows1, cols1, rows2, cols2;

    // 输入矩阵尺寸,用清晰的变量名避免混淆
    cout << "Enter the Number of rows for matrix 1 : "; 
    cin >> rows1; 
    cout << "Enter the Number of columns for matrix 1 : "; 
    cin >> cols1; 
    cout << "Enter the Number of rows for matrix 2 : "; 
    cin >> rows2; 
    cout << "Enter the Number of columns for matrix 2 : "; 
    cin >> cols2; 

    // 先检查矩阵乘法合法性:矩阵1的列数必须等于矩阵2的行数
    if (cols1 != rows2) { 
        cout << "Error: Columns of matrix 1 must equal rows of matrix 2!" << endl; 
        return -1; 
    } 

    // 初始化随机种子,让每次生成的随机数不同
    srand(time(nullptr));

    // 动态分配矩阵1:rows1行,cols1列
    int** arr1 = new int*[rows1]; 
    for (int i = 0; i < rows1; i++) { 
        arr1[i] = new int[cols1]; 
        // 填充0-99的随机数
        for (int j = 0; j < cols1; j++) { 
            arr1[i][j] = rand() % 100; 
        } 
    } 

    // 动态分配矩阵2:rows2行,cols2列
    int** arr2 = new int*[rows2]; 
    for (int i = 0; i < rows2; i++) { 
        arr2[i] = new int[cols2]; 
        for (int j = 0; j < cols2; j++) { 
            arr2[i][j] = rand() % 100; 
        } 
    } 

    // 动态分配结果矩阵:rows1行,cols2列,初始化为0
    int** multArr = new int*[rows1]; 
    for (int i = 0; i < rows1; i++) { 
        multArr[i] = new int[cols2](); 
    } 

    // 显示原始矩阵1
    cout << "\nMatrix 1:" << endl;
    for (int i = 0; i < rows1; i++) { 
        for (int j = 0; j < cols1; j++) { 
            cout << arr1[i][j] << " "; 
        } 
        cout << endl; 
    } 

    // 显示原始矩阵2
    cout << "\nMatrix 2:" << endl;
    for (int i = 0; i < rows2; i++) { 
        for (int j = 0; j < cols2; j++) { 
            cout << arr2[i][j] << " "; 
        } 
        cout << endl; 
    } 

    // 执行矩阵乘法并计时
    clock_t start = clock();
    for (int i = 0; i < rows1; i++) { 
        for (int j = 0; j < cols2; j++) { 
            for (int k = 0; k < cols1; k++) { 
                multArr[i][j] += arr1[i][k] * arr2[k][j]; 
            } 
        } 
    } 
    clock_t end = clock();
    double elapsed_time = double(end - start) / CLOCKS_PER_SEC;

    // 显示结果矩阵
    cout << "\nResult Matrix (Multiplication):" << endl;
    for (int i = 0; i < rows1; i++) { 
        for (int j = 0; j < cols2; j++) { 
            cout << multArr[i][j] << " "; 
        } 
        cout << endl; 
    } 

    // 输出乘法耗时
    cout << "\nTime taken for multiplication: " << elapsed_time << " seconds" << endl;

    // 完整释放动态内存:先释放每行,再释放指针数组
    for (int i = 0; i < rows1; i++) { 
        delete[] arr1[i]; 
        delete[] multArr[i]; 
    } 
    delete[] arr1; 
    delete[] multArr; 

    for (int i = 0; i < rows2; i++) { 
        delete[] arr2[i]; 
    } 
    delete[] arr2; 

    return 0; 
}

关键修复说明

  • 把所有变量移到main()内,避免全局变量未初始化的问题,同时用rows1、cols1这种清晰命名彻底解决行/列混淆;
  • 先检查矩阵乘法合法性,再分配内存,避免无效操作;
  • 正确实现二维动态数组的分配逻辑,严格遵循“先分配行指针数组,再给每行分配列内存”的规则;
  • 添加了矩阵乘法核心逻辑,并通过clock()实现计时功能;
  • 完整释放所有动态分配的内存,避免内存泄漏;
  • 初始化随机种子,让每次运行生成的随机数不同。

内容的提问来源于stack exchange,提问作者Rashmika97

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:52:05