在线咨询
有事点这里
有事点这里
看不懂这篇文章?联系我们
("麦洛克菲"长期致力于内核安全的推广与普及,我们更专业!)
求职QQ群:223902435。讨论各种求职笔试面试问题
作者:admin 时间:2015-10-31
标题:strlen与sizeof区别
strlen与sizeof都可以用来计算相关字符指针和字符数组的长度,容易混淆。这里用实际例子对它们加以区分。

总的来说:strlen是用来计算字符串的字符个数(不含'\0')的函数;而sizeof是用来计算类型或者变量的存储大小的操作符(而不是函数),因此sizeof的结果是在编译阶段就能确定的。

题目:
char *p1 = "12345678";
char p2[] = "12345678";
char p3[1024]="12345678";
char p4[] = {'1','2','3','4','5','6','7','8'};
sizeof(p1)=?
sizeof(p2)=?
sizeof(p3)=?
sizeof(p4)=?
strlen(p1)=?
strlen(p2)=?
strlen(p3)=?
strlen(p4)=?
分析:

p1是一个字符指针,指向了静态常量区的一个常量字符串,"12345678"。所以,sizeof(p1)=指针的长度=4;strlen(p1)=字符串"12345678"的长度(不含'\0'),所以是8。

p2是一个字符数组,由静态常量区的"12345678"进行初始化。所以sizeof(p2)是计算数组p2的长度,所以结果为"12345678"的所有字符的长度(含'\0'),所以是9。 strlen(p2)也是在计算"12345678"的长度(不含'\0'),所以是8。
 
p3是一个字符数组,由静态常量区的"12345678"进行初始化,但长度为1024。 所以,sizeof(p3)=1024;strlen(p3)为字符串"12345678"的长度(不含'\0'),所以是8。

p4是一个字符数组,由字符'1','2','3','4','5','6','7','8'进行初始化, 这样初始化与"12345678"进行初始化的区别是 前者不包含'\0'。因此,sizeof(p4)=8。由于p4作为一个字符数组,并不以'\0'结尾, 所以strlen(p4)在计算字符串长度的时候,找不到结束符'\0',会发生字符串溢出。

所以,最后答案为:
sizeof(p1)=4
sizeof(p2)=9
sizeof(p3)=1024
sizeof(p4)=8
strlen(p1)=8
strlen(p2)=8
strlen(p3)=8
strlen(p4)=字符串溢出,值不确定,甚至会引起程序崩溃