程序员 · 高频练习

char s[]="abc"时,strlen(s)和sizeof(s)为什么不同?

初级 单选题 第 1144 题 较难 程序员C语言strlensizeof字符串结束符
题目

在C语言中执行 `char s[] = "abc";`。下列结果正确的是()。

A strlen(s)=4,sizeof(s)=3
B strlen(s)=4,sizeof(s)=4
C strlen(s)=3,sizeof(s)=4
D strlen(s)=3,sizeof(s)一定等于指针大小
题目类型:原创高频练习题 用途:用于帮助理解程序员相关考点和答案解析,不等同于官方真题。
正确答案
C
答案解析

字符串文字"abc"在数组初始化时还会写入结尾的空字符'\0',所以数组s包含4个char,sizeof(s)为4。strlen从首字符开始查找到第一个'\0',返回它之前的字符数,不把结束符计入长度,因此结果是3。这里s仍是当前作用域中的数组,不是函数参数,所以sizeof得到整个数组大小。

选项分析

A

错误。把strlen和sizeof各自是否包含结束符颠倒了。

B

错误。strlen不把结尾'\0'计入长度。

C

正确。字符串长度3,字符数组总大小4字节。

D

错误。这里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。