strlen与sizeof区别

strlen与sizeof都可以用来计算相关字符指针和字符数组的长度,容易混淆。这里用实际例子对它们加以区分。

总的来说:strlen是用来计算字符串的字符个数(不含'')的函数;而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"的长度(不含''),所以是8。 

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

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

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

原文地址:https://www.cnblogs.com/fengxing999/p/11150902.html