Valgrind检测到strcpy处存在依赖未初始化值的条件跳转问题如何解决?
错误触发原因
- 核心错误是
strcpy参数顺序传反。C标准库strcpy的函数原型为char *strcpy(char *restrict dest, const char *restrict src),第一个参数是目标内存地址,第二个是待复制的源字符串地址。你的代码中写为strcpy(tempArr[ii], array[ii]),array[ii]是刚通过malloc分配的内存,未初始化任何有效内容,Valgrind检测到读取未初始化内存用于逻辑判断,就抛出了对应报错。 - 隐藏错误:你定义的
tempArr仅初始化了前6个字符串元素,当循环变量ii≥6时,tempArr[ii]属于未初始化的栈内存,调用strlen(tempArr[ii])同样会读取未初始化值,也会触发同类Valgrind报错。 - 冗余逻辑:
strcpy本身会自动将源字符串的\0终止符复制到目标地址,你后续手动加\0的代码没有实际作用,属于冗余逻辑。
修复方案
- 修正
strcpy的参数顺序,把要复制的源字符串tempArr[ii]放在第二个参数位,目标内存array[ii]放在第一个参数位。 - 调整循环次数和初始化的元素数匹配,比如把
arrLen的值从10改为6,对应tempArr里已初始化的6个字符串,避免访问未初始化的tempArr元素。 - 删除冗余的手动添加字符串终止符的代码,可补充内存释放逻辑避免后续出现内存泄漏类报错。
修复后代码示例
#include <stdio.h> #include <stdlib.h> #include <string.h> int main () { char **array; int mallocedLen = 15; // 调整arrLen和tempArr初始化的元素数一致 int arrLen = 6; char tempArr[20][20] = {"abc", "123", "def", "456", "ghi", "789"}; int ii; array = malloc(sizeof(char*) * arrLen); for(ii = 0; ii < arrLen; ii++){ array[ii] = malloc(strlen(tempArr[ii]) + 1); // 修正strcpy参数顺序 strcpy(array[ii], tempArr[ii]); mallocedLen++; } // 补充内存释放逻辑 for(ii = 0; ii < arrLen; ii++){ free(array[ii]); } free(array); return 0; }
内容的提问来源于stack exchange,提问作者V. Loh
相关产品推荐
相关产品推荐

