C语言执行for循环后strlen返回值异常与预期不符问题
问题原因
- C语言中
strlen计算字符串长度的逻辑是从传入的首地址开始向后遍历,直到遇到\0(空终止符)为止,统计的长度不包含\0本身。 - 最初的
code数组长度仅为name_length,你通过for循环给数组的所有位置都赋值为'a',整个数组中没有\0,strlen会越界访问数组之后的栈内存,直到碰到随机出现的\0才停止,所以返回的长度是不确定的异常值。 - 即使你把数组长度改为
name_length + 1,也只是预留了空终止符的存储位置,并没有手动给最后一个位置赋值为\0,多出来的那个位置存储的是栈上的随机垃圾值,大概率不是\0,所以strlen仍然会出现越界读取的异常行为。
解决方法
按两步修改代码即可:
- 定义
code数组时长度设置为name_length + 1,预留空终止符的存储空间 - 完成for循环赋值后,手动给数组的最后一位赋值为
\0,保证字符串合法
修正后的foo函数代码示例:
void foo(char *name) { printf("name = %s\n", name); int name_length = strlen(name); // 第一步:数组长度+1预留空终止符位置 char code[name_length + 1]; printf("length of name %d\n", name_length); for (int i = 0; i < name_length; i++) { code[i] = bar(name[i]); } // 第二步:手动添加空终止符 code[name_length] = '\0'; printf("length of code is %ld\n", strlen(code)); printf("name is %s\n", name); }
修改后strlen(code)的输出结果就会和name_length一致,为8。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

