欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

strlen 与 sizeof 的区别详解

发布时间:2025/5/22 编程问答 39 豆豆
生活随笔 收集整理的这篇文章主要介绍了 strlen 与 sizeof 的区别详解 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

写函数的时候,经常要对数组和字符串以及指针进行初始化。

  • strlen 是函数,sizeof 是运算符。
  • strlen 测量的是字符的实际长度。以’\0’ 结束。
  • 而sizeof 测量的是字符的分配大小。
  • 举例:
  • eg1、char arr[10] = "What?";int len_one = strlen(arr);int len_two = sizeof(arr); cout << len_one << " and " << len_two << endl;

    输出结果为:5 and 10
    点评:sizeof返回定义arr数组时,编译器为其分配的数组空间大小,不关心里面存了多少数据。strlen只关心存储的数据内容,不关心空间的大小和类型。

    eg2、char * parr = new char[10];int len_one = strlen(parr);int len_two = sizeof(parr);int len_three = sizeof(*parr);cout << len_one << " and " << len_two << " and " << len_three << endl;
    • 输出结果: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: 20

    3.但是在子函数中,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 的区别详解的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。