C语言动态二维数组实现矩阵乘法结果异常求助
嘿,我一眼就看到了你动态数组版本的核心问题——内存分配的行数量不匹配,这直接导致了堆内存越界,进而出现最后一行的垃圾值。
哪里出问题了?
看你动态数组的main代码片段:
final=(double **)malloc(diffvalue*sizeof(double*)); // ... for(i = 0; i < col; i++) { final[i] = malloc( col * sizeof(double)); }
你给final只分配了diffvalue个行指针,但后续循环却尝试给col行分配列内存。如果diffvalue < col,当循环到i >= diffvalue时,final[i]就是超出分配范围的野指针,对它赋值会直接破坏堆内存结构,这属于未定义行为——反映到结果上就是最后一行出现莫名其妙的随机数值。
而静态数组版本里,final是明确的col×col二维数组,和run函数中对hold的使用逻辑(需要col行col列的矩阵)完全匹配,所以计算结果完全正确。
怎么修复?
修正
final的行指针分配数量:
既然run函数里hold是按col行col列来使用的,那动态分配时就要把行指针数量改成col,替换掉原来的diffvalue:final = (double **)malloc(col * sizeof(double*)); // 将diffvalue改为col如果你本来的业务逻辑里
diffvalue是必须用到的,那得重新核对run函数的矩阵维度是否和它匹配,但从静态版本的代码来看,这里肯定要统一为col才能和逻辑对齐。检查
finalmidd的动态分配:
别忘了确认finalmidd的动态分配是否正确——它需要是col行value列的数组,确保行和列的数量和静态版本完全一致,不然也可能出现类似的越界问题。记得释放内存(可选但推荐):
动态分配的内存用完后要手动释放,避免内存泄漏:// 释放final for(int i = 0; i < col; i++) { free(final[i]); } free(final); // 释放transarray同理 for(int i = 0; i < col; i++) { free(transarray[i]); } free(transarray);
小提醒
动态二维数组不像静态数组那样有编译期的大小检查,所以一定要确保分配的行、列数量和后续使用的逻辑完全对应。另外,每次malloc后最好加个空指针检查,比如if (final == NULL) { /* 处理内存不足的情况 */ },避免因内存分配失败导致的空指针崩溃。
内容的提问来源于stack exchange,提问作者Kamarudeen Ayankunbi

