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

矩阵乘法函数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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:47:07