本博客整理自网络,仅供学习参考,如有侵权,联系删除。邮箱:rom100@163.com。
首先strlen是一个函数,sizeof是一个单目运算符。
strlen 它用来计算指定字符串 str 的长度,但不包括结束字符(即 null 字符)。其原型如下面的代码所示:
size_t strlen(char const* str);
char sArr[] = "ILOVEC";
/*用strlen()求长度*/
printf("sArr的长度=%d\n", strlen(sArr));
很显然,上面示例代码的运行结果为 6(因为不包括结束字符 null)。
关键字 sizeof 是一个单目运算符,参数可以是数组、指针、类型、对象、函数等,如下面的示例代码所示:
char sArr[] = "ILOVEC";
/*用sizeof求长度*/
printf("sArr的长度=%d\n", sizeof(sArr));
相对于函数 strlen,这里的示例代码运行结果为 7(因为它包括结束字符 null)。同时,对 sizeof 而言,因为缓冲区已经用已知字符串进行了初始化,其长度是固定的,所以 sizeof 在编译时计算缓冲区的长度。也正是由于在编译时计算,因此 sizeof 不能用来返回动态分配的内存空间的大小。
例子:
char str[20]="0123456789";
int a=strlen(str); //a=10; >>>> strlen 计算字符串的长度,以结束符 0x00 为字符串结束。
int b=sizeof(str); //而b=20; >>>> sizeof 计算的则是分配的数组 str[20] 所占的内存空间的大小,不受里面存储的内容改变。
strlen使用时注意事项:
strlen只能用char*做参数,且必须是以''\0''结尾的。换句话说:strlen只能计算字符串的长度。
sizeof使用时注意事项:
1 对于直接的调用sizeof,如果是数组首地址,sizeof会输出数组所占地址空间的大小(字节为单位)。如果是一个指针的话,则输出在该系统中地址的字节宽度,即(位宽/8)。
如下代码:则会以输出4, 30(一个char占一个byte空间), 4。
int *a;
char b[30];
char *c;
printf("%d, %d, d\n", sizeof(a), sizeof(b),sizeof(c));
2 如果是通过函数传递过来的地址,那么sizeof会把数组首地址和指针无差别当成是地址。
如下的代码段输出 4, 4
void test_sizeof_addr(char *a)
{
printf("%d\n", sizeof(a));
}
void test_sizeof_array(char a[])
{
printf("%d\n", sizeof(a));
}
int main()
{
char b[30];
test_sizeof_addr(b);
test_sizeof_array(b);
return 0;
}
常见的sizeof用法:
计算数组的长度
int len = sizeof(array)/sizeof(array[1]);
动态分配内存
int *ptr = malloc(10*sizeof(int));