【正确答案】
【答案解析】strlen("/0")=0,sizeof("/0")=2。
strlen执行的是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符"/0"为止,然后返回计数器值。
sizeof是C语言的关键字,它以字节的形式给出了其操作数的存储大小,操作数可以是一个表达式或括在括号内的类型名,操作数的存储大小由操作数的类型决定。
具体而言,strlen与sizeof的差别表现在以下几个方面:
1)sizeof是关键字,而strlen是函数。sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。
2)sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能够容纳实现所建立的最大对象的字节大小。
3)sizeof可以用类型作为参数,strlen只能用char*做参数,而且必须是以"/0"结尾的。sizeof还可以以函数作为参数,如int g(),则sizeofi[g())的值等于sizeof(int)的值,在32位计算机下,该值为4。
4)当数组名做sizeof的参数时不退化,传递给strlen就退化为指针了。以数组char a[10]为例,在32位机器下,sizeof(a)=1*10=10,而传递给strlen就不一样了。
5)大部分编译程序的sizeof都是在编译的时候计算的,所以可以通过sizeof(x)来定义数组维数。而strlen的计算则是在运行期计算的,用来计算字符串的实际长度,不是类型占内存的大小。例如,char str[20]="0123456789",字符数组str是编译期大小已经固定的数组,在32位机器下,为1*20=20,而其strlen大小则是在运行期确定的,所以其值为字符串的实际长度10。
6)当用于计算一个结构类型或变量的sizeof时,返回实际的大小,当用于计算一个静态变量或数组时,返回整个数组所占用的大小,而sizeof不能返回动态数组大小。
7)数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址。例如:
fun(char[8])
fun(char[])
都等价于fun(char*)。在C++里参数传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小,如果想在函数内知道数组的大小,需要这样做:进入函数后用memcpy复制出来,长度由另一个形参传进去。
fun(unsiged char*p1,int len)
{
unsigned char* buf=new unsigned char[len+1];
memcpy(buf,p1,len);
}
程序示例1:
#include<stdio.h>
#include<string.h>
int main()
{
char arr[10]="Hello";
printf("%d/n",strlen(arr));
printf("%d/n",sizeof(arr));
return 0;
}
程序输出结果:
5
10
sizeof返回定义的arr数组时,编译器为其分配的数组空间大小不关心里面存了多少数据。strlen只关心存储的数据内容,不关心空间的大小和类型。
程序示例2:
#include<stdio.h>
#include<string.h>
int main()
{
char* parr=new char[10];
printf("%d/n",strlen(parr));
printf("%d/n",sizeof(parr));
printf("%d/n",sizeof(*parr));
return 0;
}
程序输出结果:
14
4
1
在上例中,程序定义了一个字符指针parr,它指向一个分配了10个空间的字符数组,由于没有进行初始化,根据strlen的计算原理,所以不能够确定sterlen(parr)的值,因为无法确定字符串的终止位置,所以该值为一个随机值,本例中输出为14。在32位机器下,parr为一个指针,所以sizeof(parr)的值为4,parr为指向字符的指针,所以sizeof(*parr)的值为1。