You need to enable JavaScript to run this app. Valgrind检测到strcpy处存在依赖未初始化值的条件跳转问题如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

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的代码没有实际作用,属于冗余逻辑。
修复方案
  1. 修正strcpy的参数顺序,把要复制的源字符串tempArr[ii]放在第二个参数位,目标内存array[ii]放在第一个参数位。
  2. 调整循环次数和初始化的元素数匹配,比如把arrLen的值从10改为6,对应tempArr里已初始化的6个字符串,避免访问未初始化的tempArr元素。
  3. 删除冗余的手动添加字符串终止符的代码,可补充内存释放逻辑避免后续出现内存泄漏类报错。
修复后代码示例
#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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 16:54:03