大家好,我是苏貝,本篇博客带大家了解C语言中的sizeof和strlen(仅此一篇让你明白它们两的差别),如果大家觉得我写的不错的话,可以给我一个赞吗,感谢❤️
在开始文章之前,我希望读者能明白sizeof和strlen是两个不同的东西,它们之间没有联系
strlen(string length),翻译为字符串长度,所以strlen的功能就是求字符串长度。它只能作用于字符串,是C语言中的库函数,使用时要引用
那什么是字符串呢?简单来讲,由 “ ”(双引号)引起来的一串字符就是字符串,如“hello world!” “abcde”等。那我们接着介绍转义字符 ‘\0’ ,每个字符串结尾处都隐藏有 ‘\0’ ,它是字符串的结束标志,所以我们在用strlen函数求字符串长度时,遇见 ‘\0’ 时就停止读取字符串,字符串长度为 ‘\0’ 之前的字符个数,不包括 ‘\0’ 。
示例1:
int main()
{
printf("%d\n", strlen("abcdefg"));
printf("%d\n", strlen("ab\0cdefg"));
return 0;
}
//7 2
第一个字符串为:abcdefg\0,所以计算结果为 ‘\0’ 之前的个数=7
第二个字符串在 ‘\0’ 后面虽然还有5个字符,但是strlen在遇见 ‘\0’ 时就停止读取字符串,所以strlen只计算 ‘\0’ 前面的ab字符个数=2
示例2:
除了上面所说的由“ ”引起来的一串字符为字符串外,字符串也可由字符数组来存储每一个字符,如下:
int main()
{
char arr1[] = { 'a','b','c' };
char arr2[] = { 'a','b','c','\0' };
printf("%d\n", strlen(arr1));
printf("%d\n", strlen(arr2));
return 0;
}
//随机值 3
对于第二个答案3,是因为 ‘\0’ 前边只有abc 3个字符;至于第一个答案,因为strlen函数只有在遇见 ‘\0’ 时才停止读取字符串,但是在读完abc后,我们并不清楚在后面哪个内存单元存储的是 ‘\0’ ,所以编译器会返回一个随机值
sizeof是操作符,不是函数,sizeof(x)的功能是求x所占空间内存的大小,单位是字节。它可作用于字符串、数组、内置类型(int,double等)、指针类型……它的返回类型是size_t(也可以认为是无符号整型),用%zd或者%u来接收
作用于字符串:
sizeof计算的是字符串所占空间的大小,包括最后的 ‘\0’
int main()
{
printf("%zd\n", sizeof("ab\0cdefg"));
return 0;
}
//9
该字符串为:ab\0cdefg\0, ‘\0’ 是转义字符,\和0合起来被存储在一个内存空间,字符是char类型的,所以sizeof计算的结果= 9 * 1 = 9
作用于数组:
int main()
{
int arr[10] = { 0 };
char ch[5] = { 0 };
printf("%zd\n", sizeof(arr));
printf("%zd\n", sizeof(ch));
return 0;
}
//40 5
arr数组是int类型的,有10个元素,所以所占空间大小=10* 4= 40个字节
ch数组是char类型的,有5个元素,所以所占空间大小=5* 1= 5个字节
拓展:
数组名是数组首元素地址,除了以下2种情况:
(1)sizeof(数组名),此时的数组名代表整个数组,所以计算结果是整个数组的大小
(2)&数组名,此时的数组名也代表整个数组,取出的是整个数组的地址,返回的是数组首元素的地址
作用于内置类型:
int main()
{
printf("%zd\n", sizeof(char));
printf("%zd\n", sizeof(short));
printf("%zd\n", sizeof(int));
printf("%zd\n", sizeof(float));
printf("%zd\n", sizeof(double));
printf("%zd\n", sizeof(long));
printf("%zd\n", sizeof(long long));
return 0;
}
//1 2 4 4 8 4 8
作用于指针类型:
int main()
{
printf("%zd\n", sizeof(char*));
printf("%zd\n", sizeof(short*));
printf("%zd\n", sizeof(int*));
printf("%zd\n", sizeof(float*));
printf("%zd\n", sizeof(double*));
return 0;
}
在32位平台下,结果都为4
在64位平台下,结果都为8
在32位平台下,有32根地址线,那么假设每根地址线在寻址的时候产生高电平(高电压)和低电平(低电压)就是(1或者0);
那么32根地址线产生的地址就会是:
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000001
…
11111111 11111111 11111111 11111111
每个地址有32个比特位,即32/8=4个字节
同理:对于64位平台下,有8个字节