HEAP CORRUPTION DETECTED错误修复求助:C语言矩阵代码问题
问题定位与修复
核心错误原因
矩阵乘法合法性判断错误
矩阵乘法要求第一个矩阵的列数等于第二个矩阵的行数,也就是c1 == r2,但代码里错误地判断r1 == c2,导致不符合乘法规则的情况可能执行运算,或者符合规则的情况被错误拒绝。结果矩阵内存分配错误
矩阵乘法的结果矩阵维度应为第一个矩阵的行数 × 第二个矩阵的列数(即r1行,c2列),但代码中array3被错误分配为r1行c1列:int** array3 = allocate2D(r1, c1); // 错误当
c2 > c1时,arrayMultiply函数中访问arr3[i][j](j范围是0~c2-1)会超出分配的内存边界,写入堆缓冲区之外的区域,最终触发堆损坏检测。随机数种子重复初始化
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
相关产品推荐
相关产品推荐

