一段时间没写程序,可能有一些用法就会生疏。今天遇到一个sizeof和strlen的用法,折腾了老半天,事后做一个小结。
sizeof 是关键字,strlen是函数,两者有本质的差别,虽然功能相似。strlen使用的局限性比较多,如:strlen只能用char*做参数,且必须是以''\0''结尾的。详细可查看网上一些对两者的对比介绍:
http://zhidao.baidu.com/link?url=7-rArYNoQglqvJB38A1a6TiNaAL8PpwCe4fVT6XUc1DdOmRx5ZbRyjm4NI6ESxBJFv8hr_ZFzCJlRQ9oaDyF5K
下面几个例子来看看:
例子一
strlen(“abcdefgh”) = 8
sizeof(“abcdefgh”) = 9
可以看出,计算字符串长度的时候,strlen是不包含结束符的,而sizeof 会把结束符包含上。
例子二
const char *pointerArray[7] ={"abcdefgh","abcdefgh","abcdefgh","abcdefgh","abcdefgh","abcdefgh","abcdefgh"};
sizeof(pointerArray) = 28
strlen(pointerArray) 非法
strlen(pointerArray[0]) = 8
sizeof(pointerArray[0]) = 4
1、 对于指针数组,sizeof(pointerArray)算出来的长度是 “指针长度”x“数组长度” = 28,即7*sizeof(char *) = 28
2、 而strlen(pointerArray)是非法的,因为数组里面装载的是一个一个的指针。
3、 对于strlen(pointerArray[0])而言,计算的是pointerArray[0]指向的地址空间存储的字符串,即“abcdefgh”长度,为8。
4、 而sizeof(pointerArray[0])计算出来是指针的长度。(32位机上统一为4)
例子三
int array[6] = {1,2,3,4,5,6};
sizeof(array) = 24
对于以上sizeof(array) 计算出来的值是:6*sizeof(int) ,跟“例子二“的第一种情况一样。
根据以上的情况可以得知,反过来可以通过sizeof来计算数组的长度:sizeof(array)/sizeof(int)
例子四
char array [20]="0123456789";
strlen(array) = 10;
sizeof(array) = 20;
1、 strlen(array) 计算的是array指针指向的字符串长度,也就是"0123456789" ,长度位10。
顺便提一下,array 就指向数组的首地址。
2、sizeof(array)是计算数组的长度,也就是20*sizeof(char) = 20 。