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

未初始化C++字符数组strlen结果不一致的原因咨询

问题本质:未初始化内存的随机值 + strlen的工作机制

这事儿的核心在于两个关键点:strlen()的工作逻辑,以及栈上未初始化内存的「随机性」。

先讲strlen()到底在干啥:它从你传入的指针位置开始,一个字节一个字节往后扫描,直到碰到第一个值为0的字节(也就是字符串结束符'\0')才会停下,返回的长度是它扫过的非0字节的数量——注意,这个结束符本身不会被算进长度里。

再拆解你的代码情况:

  • 对于test1[5],你只把test1[4]设为0,但前4个元素是完全未初始化的。栈上的未初始化内存是程序运行时留下的「垃圾值」,这次运行刚好test1[0]就是0(或者说第一个0出现在数组的起始位置),所以strlen()一开头就碰到了结束符,返回0,输出的字符串自然是空的。这纯纯是运气好,换个时机运行说不定结果就完全不同。
  • 对于test2[128],同样只设置了最后一个元素为0,前127个都是垃圾值。这次运行时,从test2[0]开始数,前6个字节都是非0的垃圾数据(你看到的8??就是这些乱码的表现),直到test2[6]才碰到第一个0,所以strlen()返回6,输出的就是那堆乱码。

关键提醒:这属于「未定义行为」

栈上未初始化的内存内容是完全不可预测的,标准C++根本不保证它有什么固定值。你这次运行得到的结果只是某次随机情况,下次运行可能test1的长度变成3,test2的长度变成100,甚至程序直接崩溃都有可能——因为如果垃圾值里一直没碰到0,strlen()会一直越界扫描内存,这属于非法访问。

正确的初始化方式

如果要把char数组初始化为空字符串,推荐直接用:

char test1[5] = {0}; // 会自动把数组所有元素初始化为0
char test2[128] = {0};

或者用memset手动填充0(记得包含<cstring>头文件):

#include <cstring>
// ...
memset(test1, 0, sizeof(test1));
memset(test2, 0, sizeof(test2));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:19:12