为什么Valgrind会报conditional jump依赖未初始化值的错误?
错误产生原因
你定义的numbers数组长度为4,仅对下标为0、1、2的三个元素做了赋值,下标为3的元素未初始化,存储的是内存中的随机垃圾值。
你的for循环遍历范围是i < 4,会读取到numbers[3]的垃圾值参与num的计算,最终if (num)的条件判断结果依赖了这个未初始化的值,因此Valgrind抛出对应报错。
解决方案
根据你的使用场景可以二选一修改:
- 如果你仅需要拼接3个数字:将数组长度改为3,同时将循环终止条件改为
i < 3,避免访问不存在的数组元素,修改后的示例代码如下:
#include <stdio.h> int main(void) { int numbers[3]; numbers[0] = 1; numbers[1] = 3; numbers[2] = 4; int num = 0; for(int i = 0; i < 3; i++) { num *= 10; num += numbers[i]; } if (num) { printf("num %d\n", num); } }
- 如果你需要保留长度为4的数组:补充初始化
numbers[3]的数值,或者定义数组时直接整体初始化,未显式赋值的元素会自动初始化为0,例如:int numbers[4] = {1,3,4};。
内容的提问来源于stack exchange,提问作者usersman
相关产品推荐
相关产品推荐

