为何变量赋值操作会导致strlen返回不同结果?
问题分析与解答
核心原因:无终止符的字符串触发未定义行为
你定义的char sentence[10] = "this is 10";中,字符串字面量"this is 10"恰好占10个字节,数组被完全填满,没有多余空间存放C字符串必需的终止符'\0'。
strlen的工作逻辑是从起始地址遍历字节,直到找到第一个'\0'才停止计数。由于数组本身没有终止符,strlen会越界访问数组后的栈内存,这属于C语言的未定义行为——结果由栈布局、编译器优化等不确定因素决定。
两种场景的行为差异
保留
beg = 0;时返回12
局部变量在栈上连续存储,sentence数组后紧接着i和beg的内存位置。执行strlen时,这两个变量的初始值非0(未初始化的栈变量值随机),因此strlen遍历到第12个字节才遇到'\0',返回长度12。后续循环中beg = 0;给该位置写入'\0',所以打印时会输出数组的10个字符,再加越界访问到的两个'\0'。注释
beg = 0;时返回10
编译器会优化未使用的变量:因为beg未被实际使用,编译器可能不为它分配栈空间,或调整栈布局,使得sentence数组后的第一个字节恰好是'\0',strlen遍历完10个字节后就找到终止符,返回10。
修复方案
要让strlen正常工作,必须保证字符串末尾有'\0':
- 方案一:扩大数组容量,预留终止符空间,比如
char sentence[11] = "this is 10";(10个字符+1个终止符) - 方案二:手动在数组末尾添加终止符(会覆盖最后一个字符):
sentence[9] = '\0';,适合不需要保留原最后一个字符的场景。
内容的提问来源于stack exchange,提问作者Lorem Ipsum
相关产品推荐
相关产品推荐

