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

HEAP CORRUPTION DETECTED错误修复求助:C语言矩阵代码问题

问题定位与修复

核心错误原因

  1. 矩阵乘法合法性判断错误
    矩阵乘法要求第一个矩阵的列数等于第二个矩阵的行数,也就是c1 == r2,但代码里错误地判断r1 == c2,导致不符合乘法规则的情况可能执行运算,或者符合规则的情况被错误拒绝。

  2. 结果矩阵内存分配错误
    矩阵乘法的结果矩阵维度应为第一个矩阵的行数 × 第二个矩阵的列数(即r1行,c2列),但代码中array3被错误分配为r1行c1列:

    int** array3 = allocate2D(r1, c1); // 错误
    

    当c2 > c1时,arrayMultiply函数中访问arr3[i][j](j范围是0~c2-1)会超出分配的内存边界,写入堆缓冲区之外的区域,最终触发堆损坏检测。

  3. 随机数种子重复初始化
    array1Creator和array2Creator都调用srand(time(NULL)),由于两次调用间隔极短,time(NULL)返回的时间戳相同,导致两个矩阵生成的随机数序列完全一致,属于功能瑕疵。

修复后的完整代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int userInput() {
    int a = 0;
    printf_s("Input your number: ");
    scanf_s("%d", &a);
    return a;
}

// 分配二维数组内存
int** allocate2D(int rows, int cols)
{
    int** arr2D;
    int i;

    arr2D = (int**)malloc(rows * sizeof(int*));
    for (i = 0; i < rows; i++)
    {
        arr2D[i] = (int*)malloc(cols * sizeof(int));
    }
    return arr2D;
}

// 释放二维数组内存
void deallocate2D(int** arr2D, int rows)
{
    int i;

    for (i = 0; i < rows; i++)
    {
        free(arr2D[i]);
    }
    free(arr2D);
}

// 生成随机矩阵1
int** array1Creator(int** array1, int row, int col) {
    printf_s("first: \n");
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            array1[i][j] = rand() % 100;
            printf_s("%d ", array1[i][j]);
        }
        printf_s("\n");
    }
    return array1;
}

// 生成随机矩阵2
int** array2Creator(int** array2, int row, int col) {
    printf_s("second: \n");
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            array2[i][j] = rand() % 101;
            printf_s("%d ", array2[i][j]);
        }
        printf_s("\n");
    }
    return array2;
}

// 矩阵乘法运算
void arrayMultiply(int** arr1, int** arr2, int** arr3, int c1, int r1, int c2) {
    printf_s("third: \n");
    for (int i = 0; i < r1; i++) {
        for (int j = 0; j < c2; j++) {
            arr3[i][j] = 0;
            for (int a = 0; a < c1; a++) {
                arr3[i][j] += arr1[i][a] * arr2[a][j];
            }
            printf_s("%d ", arr3[i][j]);
        }
        printf_s("\n");
    }
}

int main()
{
    int r1 = userInput();
    int c1 = userInput();
    int r2 = userInput();
    int c2 = userInput();

    // 只初始化一次随机数种子
    srand(time(NULL));

    int** array1 = allocate2D(r1, c1);
    int** array2 = allocate2D(r2, c2);
    // 修复结果矩阵的维度:r1行,c2列
    int** array3 = allocate2D(r1, c2);

    // 修复矩阵乘法的合法性判断条件
    if (c1 == r2) {
        arrayMultiply(array1Creator(array1, r1, c1), array2Creator(array2, r2, c2), array3, c1, r1, c2);
    }
    else {
        printf_s("wrong values of rows or columns: 第一个矩阵的列数必须等于第二个矩阵的行数");
    }

    deallocate2D(array1, r1);
    deallocate2D(array2, r2);
    deallocate2D(array3, r1);

    return 0;
}

关键修改点说明

  • 修正矩阵乘法的合法性判断为c1 == r2,符合数学规则。
  • 将array3的内存分配改为allocate2D(r1, c2),匹配结果矩阵的正确维度,彻底避免内存越界。
  • 将srand(time(NULL))移到main函数开头,只初始化一次随机数种子,确保两个矩阵的随机数序列不同。
  • 简化arrayMultiply函数的参数,移除不必要的r2参数(合法性判断已保证c1 == r2)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 11:10:24