首先应该明确的概念是sizeof是操作符,而不是函数。strlen是一个函数。
sizeof操作符返回的是参数所占的内存数,而strlen函数返回的是参数的字符数长度,不是所占用的内存的大小。需要注意的是strlen函数的参数是字符串,并且必须以串结束符“\0”结尾。
比如说:char str[8] = "fdsa";
sizeof(str) = 8字节 //字符数组str所占用的内存大小
strlen(str) = 4 //初始化的字符长度
再比如:char *str = "Hello";
strlen(str) = 5, //初始化的字符长度
sizeof(str) = 4; //str是一个指针,指针在32位的计算机中占用4字节,在64位计算机中占用8字节
sizeof(*str) = 1; //*str表示字符串首地址的内容,在此就是字符H,占用内存大小为1字节
再看一个例子: char str[] = "0123456789";
sizeof(str) = 11; //str是数组,计算到了"\0"的位置,以此是(10+1)
strlen(str) = 10; //strlen不计算"\0"。
例4: int ss[100] = "0123456789";
sizeof(ss) = 400; //表示ss内存大小,4*100
strlen(ss) 错误,因为strlen的参数只能是char *,且必须是以"\0"结尾。
补充1:
void Func(char a[100])
{
cout<< sizeof(a) << endl; // 4字节而不是100字节
}
在参数的调用过程中,数组退化为指针。所以这里是4字节。
补充2:
int main()
{
int a[100];
int *p = NULL;
printf("%d %d %d %d %d %d\n",sizeof(p),sizeof(*p),sizeof(a),sizeof(a[100]),sizeof(&a),sizeof(&a[0]));
return 0;
}
运行结果:
![](https://img-my.csdn.net/uploads/201304/11/1365650358_7461.png)
要注意sizeof(a[100])等于4,因为a[100]只是数组中的一个元素。
补充3:
下面就考虑一下这个问题:
int main()
{
char a[1000];
int i;
for(i=0; i<1000; i++)
{
a[i] = -1-i;
}
printf("%d",strlen(a));
return 0;
}
运行结果如下: