为何无大小限制的char数组调用strlen()返回错误值?
C语言中strlen返回异常值的原因与解决办法
你遇到的问题是:代码里char br[]={'k','l'}对应的strlen(br)返回7(注释部分代码后变成3),但预期结果是2。下面直接说原因和解决办法:
原因分析
strlen的工作逻辑很简单:从传入的内存地址开始逐个读字节,直到碰到**空字符\0**才停止,返回的是\0之前的字符总数。它不管数组实际大小,只认\0这个终止符。- 你用
{'k','l'}初始化数组时,只会把两个字符存入数组,不会自动添加\0。数组br的大小是2,刚好装下两个字符,后面没有多余空间放终止符。 - 这时候
strlen(br)会越界访问数组之外的内存,直到在某个随机位置碰到\0才停下。返回的数字完全取决于栈内存里的随机数据,这在C语言里叫未定义行为——栈内存布局变了(比如注释掉上面的代码),结果就会跟着变,本质都是越界访问导致的随机结果。
对比代码里的char b[7]={'a','b','c','d','e'}:这个数组声明了大小7,只初始化了5个字符,剩下的2个位置会被C语言自动填充为\0,所以strlen(b)能正确返回5,因为它在第6个位置就碰到了终止符。
解决办法
只要让br数组末尾存在\0就行,三种常用方式:
- 手动在初始化列表加
\0
char br[]={'k','l','\0'};
数组大小会自动变成3,最后一个元素是\0,strlen会正确返回2。
- 用字符串字面量初始化
这是最常用的方式,字符串字面量会自动在末尾追加\0:
char br[]="kl";
数组大小同样是3,包含'k'、'l'和\0,strlen返回2。
- 手动给数组末尾赋值
\0
如果已经声明了数组,确保数组有足够空间的话,可以手动设置:
char br[3]={'k','l'}; br[2] = '\0';
注意数组要声明足够大(至少3),不然会触发新的越界问题。
附你的测试代码:
#include<stdio.h> #include<string.h> int main(){ int a[]={1,2,3,4}; int size= sizeof(a)/sizeof(int); printf("\nSize/capacity of integer type array(with no limit) %d\n",size); int a1[6]={1,2,3,4}; int size1= sizeof(a1)/sizeof(int); printf("\nSize/capacity of integer type array(with a limit of 7) %d\n",size1); printf("\n"); char b[7]={'a','b','c','d','e'}; int size2= sizeof(b)/sizeof(char); int length=strlen(b); printf("\nSize/capacity of char type array(with a limit of 7) %d\n",size2); printf("\nNumber of char type data in the array %d\n",length); char br[]={'k','l'}; int size3= sizeof(br)/sizeof(char); int length1=strlen(br); printf("\nSize/capacity of char type array(with no limit) %d\n",size3); printf("\nNumber of char type data in the array length1 %d\n",length1); //answer should have been 2 return 0; }
测试输出:
Size/capacity of integer type array(with no limit) 4
Size/capacity of integer type array(with a limit of 7) 6
Size/capacity of char type array(with a limit of 7) 7
Number of char type data in the array 5
Size/capacity of char type array(with no limit) 2
Number of char type data in the array length1 7
内容的提问来源于stack exchange,提问作者cookie
相关产品推荐
相关产品推荐

