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函数:
malloc分配的120字节内存是未初始化的,内存中是随机垃圾值。- 函数仅将
command中的字符复制到input,直到遇到换行符或读完read返回的长度,但复制完成后没有给input添加字符串终止符'\0'。 strlen的工作逻辑是从起始地址开始逐个字节查找'\0',找不到就会一直遍历未初始化的内存,这直接触发了未初始化值的警告。
修复方案
- 在
UserInput的for循环结束后,添加一行代码确保input正确终止:
input[i] = '\0';
- 同时修正
trim函数的while条件:原条件i > 0会漏掉对字符串第一个字符(索引0)的检查,如果字符串全是空白字符,最终不会截断,应改为i >= 0。
内容的提问来源于stack exchange,提问作者Ada_lovelace
相关产品推荐
相关产品推荐

