笔试中经常遇到sizeof和strlen相关的问题,应试者稍有不慎就会中招。其实它们都是C中最基本的概念之一,如果笔试中答错了,无疑会得到考官的“鄙视”。小弟在此总结一下,如有不完整或错误之处,敬请补充和指正。
1, sizeof是操作符(operator),strlen是函数。
2, 因为sizeof是operator,所以sizeof后面如果是类型,必须加括号,如果是变量名可以不加括号。
3, sizeof操作符的结果类型是size_t(被typedef为unsigned int类型)。
4, sizeof可以用类型做参数,strlen只能用char *类型的变量作为参数,并且必须以“/0”结尾。strlen计算字符串的长度,一直到遇到“/0”为止。
5, 数组作为sizeof的参数不退化,传递给strlen就退化为指针。
6, 大部分编译程序在编译时计算了sizeof,因此sizeof可以用来定义数组维数的原因;strlen的结果要在运行时计算,计算字符串的长度,而不是类型占内存的大小。
7, 当使用了一个结构类型或变量时,sizeof返回实际的大小。当使用一静态的空间数组时,sizeof返回全部数组的尺寸。sizeof不能返回被动态分配的数组或外部的数组的尺寸。
8, sizeof操作符不能用于函数类型,不完全类(即具有位置存储大小数据的数据类型,比如未知存储大小的数组类型,未知内容的struct或union,void类型等)型或位字段。
下面举几个例子:
char * str = “12345”;
strlen(str) = 5, 字符串实际长度为5(不包括”/0”)
sizeof(str) = 4, str是指向字符串首地址的指针
sizeof(*str) = 1, *str是字符串的第一个字符
char arr[] = “12345”;
strlen(arr) = 5, 字符串实际长度为5(不包括”/0”)
sizeof(arr) = 6, arr是数组,计算到默认的”/0”的位置
sizeof(*arr) = 1, *arr是字符串数组的第一个字符
char arr1[100] = “12345”
sizeof(arr1) = 100, arr1表示在内存中分配的大小,100x1 = 100
strlen(arr1) = 5, 字符串实际长度为5(不包括”/0”)