user-0 提问: 字符串长度疑问：strlen和sizeof 问题，求高手解答

回复:
user: user-1
content: 数组还包含了/0的

user: user-2
content: strlen 得到字符个数 不包括'\0' sizeof是变量内存大小

user: user-3
content: 画个图比较清楚嘛  char *str="ac23";                      --------------------- 0x01234567   |-----> |0x61|0x63|0x32|0x33|              |       ---------------------              |       |0x00|..............|              |       ---------------------              |       ...              |       str              |       --------------------- 0xnnnnnnnn   --------|0x01|0x23|0x45|0x67|                       ---------------------    char str[]="ac23";                       str                      --------------------- 0xnnnnnnnn           |0x61|0x63|0x32|0x33|                       ---------------------                      |0x00|..............|                      ---------------------                      ...

user: user-4
content: LZ小白

user: user-5
content: 引用 16 楼 mymtom 的回复:画个图比较清楚嘛  char *str="ac23";                      --------------------- 0x01234567   |-----> |0x61|0x63|0x32|0x33|              |       ---------------------              |       |0x00|..............|              |       ---------------------              |       ...              |       str              |       --------------------- 0xnnnnnnnn   --------|0x01|0x23|0x45|0x67|                       ---------------------    char str[]="ac23";                       str                      --------------------- 0xnnnnnnnn           |0x61|0x63|0x32|0x33|                       ---------------------                      |0x00|..............|                      ---------------------                      ...  求教此图？

user: user-6
content: 引用 16 楼 mymtom 的回复:画个图比较清楚嘛  char *str="ac23";                      --------------------- 0x01234567   |-----> |0x61|0x63|0x32|0x33|              |       ---------------------              |       |0x00|..............|              |       ---------------------              |       ...              |       str              |       --------------------- 0xnnnnnnnn   --------|0x01|0x23|0x45|0x67|                       ---------------------    char str[]="ac23";                       str                      --------------------- 0xnnnnnnnn           |0x61|0x63|0x32|0x33|                       ---------------------                      |0x00|..............|                      ---------------------                      ...  这个完美

user: user-7
content: char  *p = "1234"; char q[] = "1234"; strlen(p) = 4;//遇'\0'结束 sizeof(p) = 4;//计算指针的大小  strlen(q) = 4;//遇'\0'结束 sizeof(q) = 5;//计算数组的大小，占5字节，包括'\0'

user: user-8
content: 说strlen 遇到'\0'就结束的都是

user: user-9
content: strlen 是对‘\0’结尾的字符串求长度 sizeof 是对对象或者类型求大小

user: user-10

user: user-11
content: 引用 13 楼 linux_hsylar 的回复:[quote=引用 楼主 onion2007 的回复:] 代码1： char *str="ac23";   //首先 str是个字符指针，它指向的是代码区中字符常量“ac23”，它在程序中在栈中占用4个字节（在32位系统中是4个字节，64位系统中是8个字节）； printf("strlen = %i\nsizeof = %i\n",strlen(str),sizeof(str));  //用strlen（str)获取的是str指向的字符串的有效个数是4，但是“ac23”里面的字符个数是5，末尾有个'\0'(每个字符串都有）；                                                                                                      //用sizeofstr)编译器会把理解为获取str这个指针变量的大小（当然上面已经说了，在32位系统中是4个字节，64位系统中是8个字节）；  结果：strlen =4             sizeof =4  代码2： char str[]="ac23";   //这个是数组，数组比较特殊，编译器处理方式ac23传入到a（它是数组的首地址）指向的堆空间（5个char字符，包括最后一个'\0'); printf("strlen = %i\nsizeof = %i\n",strlen(str),sizeof(str));//strlen没有区别，但是sizeof（数组名）获取的是数组的大小，是5个char类型； 结果：strlen =4             sizeof =5  为啥不一样？ 数组如果当形参的话，你在函数内部使用sizeof（数组名）获取的是数组名的大小（32位系统下为4,64位系统下是8）；[/quote]  引用 13 楼 linux_hsylar 的回复:[quote=引用 楼主 onion2007 的回复:] 代码1： char *str="ac23";   //首先 str是个字符指针，它指向的是代码区中字符常量“ac23”，它在程序中在栈中占用4个字节（在32位系统中是4个字节，64位系统中是8个字节）； printf("strlen = %i\nsizeof = %i\n",strlen(str),sizeof(str));  //用strlen（str)获取的是str指向的字符串的有效个数是4，但是“ac23”里面的字符个数是5，末尾有个'\0'(每个字符串都有）；                                                                                                      //用sizeofstr)编译器会把理解为获取str这个指针变量的大小（当然上面已经说了，在32位系统中是4个字节，64位系统中是8个字节）；  结果：strlen =4             sizeof =4  代码2： char str[]="ac23";   //这个是数组，数组比较特殊，编译器处理方式ac23传入到a（它是数组的首地址）指向的堆空间（5个char字符，包括最后一个'\0'); printf("strlen = %i\nsizeof = %i\n",strlen(str),sizeof(str));//strlen没有区别，但是sizeof（数组名）获取的是数组的大小，是5个char类型； 结果：strlen =4             sizeof =5  为啥不一样？ 数组如果当形参的话，你在函数内部使用sizeof（数组名）获取的是数组名的大小（32位系统下为4,64位系统下是8）；[/quote]  完美补充~~

user: user-12
content: 引用 楼主 onion2007 的回复:代码1： char *str="ac23";   //首先 str是个字符指针，它指向的是代码区中字符常量“ac23”，它在程序中在栈中占用4个字节（在32位系统中是4个字节，64位系统中是8个字节）； printf("strlen = %i\nsizeof = %i\n",strlen(str),sizeof(str));  //用strlen（str)获取的是str指向的字符串的有效个数是4，但是“ac23”里面的字符个数是5，末尾有个'\0'(每个字符串都有）；                                                                                                      //用sizeofstr)编译器会把理解为获取str这个指针变量的大小（当然上面已经说了，在32位系统中是4个字节，64位系统中是8个字节）；  结果：strlen =4             sizeof =4  代码2： char str[]="ac23";   //这个是数组，数组比较特殊，编译器处理方式ac23传入到a（它是数组的首地址）指向的堆空间（5个char字符，包括最后一个'\0'); printf("strlen = %i\nsizeof = %i\n",strlen(str),sizeof(str));//strlen没有区别，但是sizeof（数组名）获取的是数组的大小，是5个char类型； 结果：strlen =4             sizeof =5  为啥不一样？ 数组如果当形参的话，你在函数内部使用sizeof（数组名）获取的是数组名的大小（32位系统下为4,64位系统下是8）；

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:谁说sizeof可以求字符串长度来着？出来受死！

user: user-0
content: 3Q！ 我明白了！  引用 8 楼 starytx 的回复:strlen函数是计算字符个数（遇到结束符'\0'结束）。 sizeof操作符中不同的东西，返回的数值不同。如果里边是一个指针，那就是计算指针的大小，32位系统一般都是4.如果是一个数组名，就是计算数组占得内存空间。你的例子中那个数组有4个字符(一个字符占1个字节，sizeof(char)=1)+隐含的结束符'\0'=5

user: user-0
content: 谢谢你！ strlen遇到‘\0’结束，所以它是统计\0’之前字符个数； 而sizeof是变量占内存大小，指针变量占内存就是4，而数组则是受数组元素个数影响！ 3Q! 引用 1 楼 xihu1364 的回复:strlen遇到‘\0’结束 sizeof是变量内存大小   如你举例： 代码1：  char *str="ac23";   printf("strlen = %i\nsizeof = %i\n",strlen(str),sizeof(str));  //这里的strlen是“ac23”字符的长度，其实这个字符串是包含‘\0’的                                                 //而sizeof是计算str这个指针的大小   指针大小就是4 结果：strlen =4             sizeof =4    代码2：  char str[]="ac23"; printf("strlen = %i\nsizeof = %i\n",strlen(str),sizeof(str));//这里的sizeof是计算数组的大小  数组大小就是5  因为该数组的成员           //包含 str[0] = 'a', str[1] = 'c', str[2] = '2', str[3] = '3', str[4] = '\0' 所以是5个 //你可以在试试 str[] = "abcd123"长一点的字符串试试  结果：strlen =4             sizeof =5

user: user-13
content: 其实这个问题可以自行百度的

user: user-14
content: strlen函数是计算字符个数（遇到结束符'\0'结束）。 sizeof操作符中不同的东西，返回的数值不同。如果里边是一个指针，那就是计算指针的大小，32位系统一般都是4.如果是一个数组名，就是计算数组占得内存空间。你的例子中那个数组有4个字符(一个字符占1个字节，sizeof(char)=1)+隐含的结束符'\0'=5

user: user-15
content: strlen是计算字符有效输入长度，如果定义cahr a[10]={'1','2','3','4','5'}，用strlen(a)后是返回5的。 sizeof是变量内存大小

user: user-16
content: strlen是字符串长度，或者说字符数组中，字符'\0'所在的下标。 sizeof是对象所占的内存大小。注意：指针的大小是指针本身的大小，而不是，指针指向内容的大小。

user: user-17
content: sizeof一个指针永远是4 sizeof一个数组是数组长度