在C语言中执行 `char s[] = "abc";`。下列结果正确的是()。
字符串文字"abc"在数组初始化时还会写入结尾的空字符'\0',所以数组s包含4个char,sizeof(s)为4。strlen从首字符开始查找到第一个'\0',返回它之前的字符数,不把结束符计入长度,因此结果是3。这里s仍是当前作用域中的数组,不是函数参数,所以sizeof得到整个数组大小。
选项分析
错误。把strlen和sizeof各自是否包含结束符颠倒了。
错误。strlen不把结尾'\0'计入长度。
正确。字符串长度3,字符数组总大小4字节。
错误。这里s是数组对象,sizeof(s)不是指针大小。
本题为什么容易错
大家容易把“字符串”和“字符数组”混成同一个量。字符串规则关心第一个空字符在哪里,数组规则关心编译时实际分配了多少元素。
简短答案
char s[]="abc"时,strlen(s)和sizeof(s)为什么不同,正确答案是 C(strlen(s)=3,sizeof(s)=4)。字符串文字"abc"在数组初始化时还会写入结尾的空字符'\0',所以数组s包含4个char,sizeof(s)为4。strlen从首字符开始查找到第一个'\0',返回它之前的字符数,不把结束符计入长度,因此结果是3。这里s仍是当前作用域中的数组,不是函数参数,所以sizeof得到整个数组大小。
易混淆概念对比表
| 概念 | 本题判断 | 区别要点 | 记忆提示 |
|---|---|---|---|
| strlen(s)=4,sizeof(s)=3 | 本题干扰项 | 错误。把strlen和sizeof各自是否包含结束符颠倒了。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| strlen(s)=4,sizeof(s)=4 | 本题干扰项 | 错误。strlen不把结尾'\0'计入长度。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| strlen(s)=3,sizeof(s)=4 | 本题正确答案 | 正确。字符串长度3,字符数组总大小4字节。 | 看到题干核心场景时优先联想到它 |
| strlen(s)=3,sizeof(s)一定等于指针大小 | 本题干扰项 | 错误。这里s是数组对象,sizeof(s)不是指针大小。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
本题易混淆选项怎么区分
- strlen(s)=4,sizeof(s)=3:错误。把strlen和sizeof各自是否包含结束符颠倒了。
- strlen(s)=4,sizeof(s)=4:错误。strlen不把结尾'\0'计入长度。
- strlen(s)=3,sizeof(s)一定等于指针大小:错误。这里s是数组对象,sizeof(s)不是指针大小。
知识点详解
C标准规定字符数组用字符串文字初始化时,会依次写入字符串字节,并在空间足够或数组大小未知时写入结尾空字符。strlen计算字符串长度,返回第一个空字符之前的字符数量;sizeof数组则返回整个数组的总字节数。
备考速记
strlen不带终点站,sizeof把数组车厢全数上。
C语言 在字符串结束符场景中的作用
复制字符串时,目标缓冲区通常至少需要strlen(source)+1个字节来容纳结束符。若只按strlen分配,后续字符串函数可能越界。
同类题怎么考
- 计算字符数组的strlen与sizeof。
- 判断字符串初始化是否为结束符预留空间。
C语言 在程序员软考中的考法
先判断变量在当前表达式中究竟是数组还是指针,再分别按sizeof和strlen的定义计算。
解题思路
先把内存画成四格:a、b、c、'\0'。strlen数到结束符前停下,得到3;sizeof把四个char都算上,得到4,选C。
考点定位
sizeof根据操作数类型给出对象占用字节数;strlen运行时查找字符串结束符。一个问存储空间,一个问空字符前的字符串长度。
易错提醒
- 对没有'\0'结尾的字符数组调用strlen。
- 把sizeof指针的结果当作指针所指字符串长度。
- 忘记char s[3]="abc"没有空间存放结束符。
备考提示
- 把char s[]、char *p和函数参数char s[]放在三行比较sizeof结果。
- 做字符串题先找'\0',再决定strlen是否有定义良好的终点。
你可能还想了解
- strlen和sizeof为什么差1?
- strlen包含\0吗?
- char s[]=abc占几个字节?
本文小结
char s[]="abc"实际包含a、b、c和结尾空字符,因此strlen(s)=3,而sizeof(s)=4。