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

C语言执行for循环后strlen返回值异常与预期不符问题

问题原因
  • C语言中strlen计算字符串长度的逻辑是从传入的首地址开始向后遍历,直到遇到\0(空终止符)为止,统计的长度不包含\0本身。
  • 最初的code数组长度仅为name_length,你通过for循环给数组的所有位置都赋值为'a',整个数组中没有\0,strlen会越界访问数组之后的栈内存,直到碰到随机出现的\0才停止,所以返回的长度是不确定的异常值。
  • 即使你把数组长度改为name_length + 1,也只是预留了空终止符的存储位置,并没有手动给最后一个位置赋值为\0,多出来的那个位置存储的是栈上的随机垃圾值,大概率不是\0,所以strlen仍然会出现越界读取的异常行为。
解决方法

按两步修改代码即可:

  1. 定义code数组时长度设置为name_length + 1,预留空终止符的存储空间
  2. 完成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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 03:27:05