矩阵乘法函数Valgrind检测出未初始化值问题求助
问题分析与修复方案
我一眼就定位到Valgrind警告的根源了——你的循环变量初始化出问题了!
先看你代码里的这段内存分配循环:
for (int i; i < (matrix_1 -> height); ++i) { mult[i] = calloc(matrix_2 -> width, sizeof(int)); }
这里的int i只做了声明,完全没有初始化值,它的初始状态是栈上的随机垃圾数据。当第一次执行循环条件判断i < matrix_1->height时,程序用的就是这个未初始化的垃圾值,这直接触发了Valgrind的"Uninitialised value was created by a stack allocation"警告。
修复方法
只需要把循环变量i初始化为0即可,修改后的代码如下:
for (int i = 0; i < (matrix_1 -> height); ++i) { mult[i] = calloc(matrix_2 -> width, sizeof(int)); }
为什么之前输出结果还正确?
这纯属运气好——刚好栈上的垃圾值在第一次循环时小于matrix_1->height,后续循环的递增逻辑又正常执行了。但这属于未定义行为,换个运行环境或者栈内存状态变化,程序很可能直接崩溃或者输出完全错误的结果。
额外检查提示
建议你顺便检查三重循环里的其他变量(比如列索引、累加用的临时变量)是否都做了正确初始化,避免出现类似的未定义行为。另外,函数执行完毕后,如果不需要保留mult指向的内存,记得及时释放,防止内存泄漏。
内容的提问来源于stack exchange,提问作者M.Pokorny
相关产品推荐
相关产品推荐

