sizeof运算符和strlen()函数

首先放上代码和运行结果。(在VC6.0上运行)

 1 #include<stdio.h>
 2 #include<string.h>
 3 
 4 int main(void)
 5 {
 6     char s1[]="YeHuan";
 7     char *s2="YeHuan";
 8     char s3[]="Ye\0Huan";
 9     char *s4="Ye\0Huan";
10     printf("sizeof(s1) %d\n",sizeof(s1));
11     printf("sizeof(s2) %d\n",sizeof(s2));
12     printf("sizeof(s3) %d\n",sizeof(s3));
13     printf("sizeof(s4) %d\n",sizeof(s4));
14     printf("sizeof(\"YeHuan\") %d\n",sizeof("YeHuan"));
15     printf("sizeof(\"Ye\\0Huan\") %d\n",sizeof("Ye\0Huan"));
16     printf("strlen(s1) %d\n",strlen(s1));
17     printf("strlen(s2) %d\n",strlen(s2));
18     printf("strlen(s3) %d\n",strlen(s3));
19     printf("strlen(s4) %d\n",strlen(s4));
20     printf("strlen(\"YeHuan\") %d\n",strlen("YeHuan"));
21     printf("strlen(\"Ye\\0Huan\") %d\n",strlen("Ye\0Huan"));
22     return 0;
23 }

运行结果如下。

sizeof(s1) 7
sizeof(s2) 4
sizeof(s3) 8
sizeof(s4) 4
sizeof("YeHuan") 7
sizeof("Ye\0Huan") 8
strlen(s1) 6
strlen(s2) 6
strlen(s3) 2
strlen(s4) 2
strlen("YeHuan") 6
strlen("Ye\0Huan") 2

下面本人对这个运行结果作简要分析。

首先sizeof运算符是计算后面的变量(或者常量、数组名、类型标识符等等)所占内存空间字节大小,该运算结果在运行之前是确定的。

所以一个数组所占字节大小恰好是数组内元素个数乘以每个元素占字节大小,而数组内元素的个数(仅考虑一维数组)在定义数组时的中括号内给出,如不给出,则由初始化的内容决定。

由此可知s1数组内元素个数为7,因为后面字符串需要占用7个字节(包括字符串结尾标记'\0'),所以得到运行结果的第1、5行。

同理可得s3数组内元素个数为8(虽然里面有个'\0',但是要想完全存放里面所有的字符必须要8个字节),所以得到运行结果的第3、6行。

因为指针变量占4个字节(win32控制台应用程序中,包括字符指针、整型指针、数组指针、结构体指针、函数指针、二级指针、多级指针、通用指针void *等等),所以得到运行结果的第2、4行。

strlen()函数用于计算一个字符指针指向的区域(自动向后延伸,到'\0'结束)所能得到的字符串的长度(即字符个数,不包括结尾标记),所以得到运行结果的第7到12行。

猜你喜欢

转载自www.cnblogs.com/leisureeen/p/11891950.html