strlen 与 sizeof 的区别详解
写函数的时候,经常要对数组和字符串以及指针进行初始化。
输出结果为:5 and 10
点评:sizeof返回定义arr数组时,编译器为其分配的数组空间大小,不关心里面存了多少数据。strlen只关心存储的数据内容,不关心空间的大小和类型。
- 输出结果:23 and 4 and 1
点评:第一个输出结果23实际上每次运行可能不一样,这取决于parr里面存了什么(从parr[0]开始知道遇到第一个NULL结束);第二个结果实际上本意是想计算parr所指向的动态内存空间的大小,但是事与愿违,sizeof认为parr是个字符指针,因此返回的是该指针所占的空间(指针的存储用的是长整型,所以为4);第三个结果,由于*parr所代表的是parr所指的地址空间存放的字符,所以长度为1。
比如:
char str[20] = "hello";printf("strlen: %d\n", strlen(str)); printf("sizeof: %d\n", sizeof(str));结果显示为:
[root@localhost 0703]# ./hello strlen: 5 sizeof: 203.但是在子函数中,ziseof 会把从主函数中传进来的字符数组当作是指针来处理。指针的大小又是由机器来决定,而不是人为的来决定的。
#include <stdio.h>void size_of(char str[]) {printf("sizeof:%d\n", sizeof(str)); }int main() {char str[20] = "hello";size_of(str);return 0; }结果显示为sizeof:4
4.我们知道字符数组的初始化一次性赋值,也可以逐个赋值。可以指定数组的大小,也可以不指定数组长度。
#include <stdio.h> #include <string.h>int main() {char str1[] = "hello";char str2[] = {'h', 'e', 'l', 'l', 'o', '\0'};char str3[] = {'h', 'e', 'l', 'l', 'o'};printf("str1:%s\n",str1);printf("str2:%s\n",str2);printf("str3:%s\n",str3);printf("str1:%d\n", strlen(str1));printf("str2:%d\n", strlen(str2));printf("str3:%d\n", strlen(str3));return 0; }结果显示为:
str1:hello str2:hello str3:hellohello str1:5 str2:5 str3:10这是为什么呢?
我们知道字符串是以 ‘\0’ 为结束标志的,所以char str1[ ] = “hello” 等效于char str2[ ] = {‘h’ , ‘e’ , ‘l’ , ‘l’ , ‘o’ , ‘\0’} 。strlen函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个’\0’,如果你只定义没有给它赋初值,这个结果是不定的,它会从首地址一直找下去,直到遇到’\0’停止。而如果不在字符数组初始化的时候加上\0,那么strlen 得到的值就不是正确的数值,打印出来的结果也不是想要的结果。因此我们要避免这种情况,在初始化的时候要记得加上 \0,或者一次性赋初值。
5.strlen的结果要在运行的时候才能计算出来,是用来计算字符串的长度,不是类型占内存的大小。而大部分编译程序在编译的时候就把sizeof计算过了是类型或是变量的长度。
6.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以’’\0’'结尾的
char str[20]="0123456789"; int a=strlen(str); //a=10; >>>> strlen 计算字符串的长度,以结束符 0x00 为字符串结束。 int b=sizeof(str); //而b=20; >>>> sizeof 计算的则是分配的数组 str[20] 所占的内存空间的大小,不受里面存储的内容改变。上面是对静态数组处理的结果,如果是对指针,结果就不一样了
char* ss = “0123456789”;
sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针,sizeof 获得的是一个指针的之所占的空间,应该是
长整型的,所以是4
sizeof(*ss) 结果 1 ===》*ss是第一个字符 其实就是获得了字符串的第一位’0’ 所占的内存空间,是char类
型的,占了 1 位
strlen(ss)= 10 >>>> 如果要获得这个字符串的长度,则一定要使用 strlen
总结
以上是生活随笔为你收集整理的strlen 与 sizeof 的区别详解的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: USB的pid和vid以及usb路径名字
- 下一篇: 关于程序中的操作符左移和右移问题