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

C代码调用strlen时出现未初始化值依赖的条件跳转问题求助

问题分析:字符串末尾空白去除函数的未初始化值错误

这段C代码的目标是去除字符串末尾的空白字符,但测试时在trim函数第3行int i = strlen(s) - 1;触发了“Conditional jump or move depends on uninitialized value(s)”错误。trim函数由读取命令行输入的UserInput函数调用,核心疑问是:调用strlen前是否需要初始化该字符串指针?

相关代码

trim函数

void trim(char *s)
{
    int i = strlen(s) - 1;
 
    while (i > 0)
    {
        if (s[i] == ' ' || s[i] == '\t')
            i--;
        else /* 找到从末尾数第一个非空白字符的位置 */
            break;
    }
    s[i + 1] = '\0';
}

UserInput函数

char *UserInput()
{
    char *input = (char *)malloc(120);

    char command[120];
    int len = read(STDIN_FILENO, command, 120 - 1);
    int i;
    for (i = 0; i < len; i++)
    {
        if (command[i] == '\n')
        {
            break;
        }
        input[i] = command[i];
    }
    trim(input);
    return input;
}

问题解答

调用strlen前必须确保字符串是合法的C风格字符串(即以'\0'结尾),本质上不是要“初始化指针”,而是要保证指针指向的内存区域是一个正确终止的字符串。

当前代码的问题根源在UserInput函数:

  1. malloc分配的120字节内存是未初始化的,内存中是随机垃圾值。
  2. 函数仅将command中的字符复制到input,直到遇到换行符或读完read返回的长度,但复制完成后没有给input添加字符串终止符'\0'。
  3. strlen的工作逻辑是从起始地址开始逐个字节查找'\0',找不到就会一直遍历未初始化的内存,这直接触发了未初始化值的警告。

修复方案

  1. 在UserInput的for循环结束后,添加一行代码确保input正确终止:
input[i] = '\0';
  1. 同时修正trim函数的while条件:原条件i > 0会漏掉对字符串第一个字符(索引0)的检查,如果字符串全是空白字符,最终不会截断,应改为i >= 0。

内容的提问来源于stack exchange,提问作者Ada_lovelace

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 17:25:19