关于数组中的sizeof和strlen

来源:互联网 发布:小米电视有线网络ip 编辑:程序博客网 时间:2024/04/30 16:40

sizeof()求得是变量或者空间开辟空间的大小,而strlen()函数参数接收的必须是一个有效地址

一:一维数组

int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));//16  当arr单独放在sizeof()的时候代表整个数组,因为数组中有4个元素,而每个元素都是整型,都有四个字节,所以4*4=16字节.

printf("%d\n",sizeof(a+0));//4   表示首元素的地址,而地址占4个字节。

printf("%d\n",sizeof(*a));//4   首元素所占空间的大小,一个整型,4个字节

printf("%d\n",sizeof(a+1));//4  首元素的地址+1,还是地址。所以为4个字节

printf("%d\n",sizeof(a[1]));//4  指向的是数组中的第二个元素,一个整型,大小为4

printf("%d\n",sizeof(&a));//4    表示整个数组的地址,数组地址也是地址,所以大小为4

printf("%d\n",sizeof(*&a));//16(*&a)等价于a,所以代表是整个数组,所以大小为16

printf("%d\n",sizeof(&a+1));//4 跳过整个数组后的下一个地址,还是4个字节

printf("%d\n",sizeof(&a[0]));//4  数组首元素的地址,还是4个字节

printf("%d\n",sizeof(&a[0]+1));//4   指向第二个元素的地址


二 字符数组

char arr[] = {'a','b','c','d','e','f'};

(1)sizeof

printf("%d\n", sizeof(arr));//6  表示整个数组的大小,因为为char型,所以1*6=6

printf("%d\n", sizeof(arr+0));//4 表示数组首元素的地址,大小为4个字节

printf("%d\n", sizeof(*arr));//1 首元素所占空间的大小,char型,1个字节

printf("%d\n", sizeof(arr[1]));//1 指向数组中的第二个字符,大小为1个字节

printf("%d\n", sizeof(&arr));//4 表示整个数组的地址,数组地址也是地址,所以大小为4个字节

printf("%d\n", sizeof(&arr+1));//4  跳过整个数组后的下一个地址,大小为4个字节

printf("%d\n", sizeof(&arr[0]+1));//4  第二个元素的地址,还是4个字节

(2)strlen

  printf("%d\n", strlen(arr));//随机值19  不知道什么时候会遇到'\0'或者0或者NULL结束,所以为随机值

  printf("%d\n", strlen(arr+0));//随机值19  从数组首元素‘a’开始,不知道什么时候会遇到'\0'或者0或者NULL结束,所以为随机值

  printf("%d\n", strlen(*arr));//err  系统崩溃,因为字符a不是一个有效地址

  printf("%d\n", strlen(arr[1]));//err 系统崩溃,因为字符b不是一个有效地址

  printf("%d\n", strlen(&arr));//随机值19  先找到整个数组的地址(也可以说是数组首元素的地址)然后从第一个字符开始往后找,不知道什么时候会遇到'\0'或者0或者NULL结束,所以为随机值

  printf("%d\n", strlen(&arr+1));//随机值13  跳过整个数组后开始往后找,不知道什么时候会遇到'\0'或者0或者NULL结束,所以为随机值,因为数组的长度为6,所以19-6=13

  printf("%d\n", strlen(&arr[0]+1));//随机值18 从数组的第二个字符开始往后找,不知道什么时候会遇到'\0'或者0或者NULL结束,所以为随机值,因为‘a’的长度为1,所以19-1=18


char *p = "abcdef";

(1)strlen

 printf("%d\n", strlen(p));//6  p存的是字符'a'的地址,从a开始遇到'\0'结束。所以为6个字节(不包括\0) 

 printf("%d\n", strlen(p+1));//5 指向的是第二个字符‘b’,从b开始遇到'\0'结束。所以为5个字节(不包括\0)

 printf("%d\n", strlen(*p));//err  系统崩溃,因为字符a不是一个有效地址

 printf("%d\n", strlen(p[0]));//err  系统崩溃,因为字符a不是一个有效地址

 printf("%d\n", strlen(&p));//随机值x  从p的地址开始往后面找,不知道什么时候会遇到'\0'或者0或者NULL结束,所以为随机值

 printf("%d\n", strlen(&p+1));// 随机值 从p的地址后面的一个地址开始往后面找,不知道什么时候会遇到'\0'或者0或者NULL结束,所以为随机值

 printf("%d\n", strlen(&p[0]+1));//5  从第二个元素开始往后找,遇到'\0'结束。所以为5个字节(不包括\0)

(2)sizeof

printf("%d\n", sizeof(p));//4  p中存放的a的地址,地址大小为4个字节

printf("%d\n", sizeof(p+1));//4 地址+1之后还是地址,大小为4个字节

printf("%d\n", sizeof(*p));//1  ‘a’字符所占空间的大小为1个字节

printf("%d\n", sizeof(p[0]));//‘a’字符所占空间的大小为1个字节

printf("%d\n", sizeof(&p));//4  表示指针变量p的地址还是地址,大小为4个字节

printf("%d\n", sizeof(&p+1));//4 指针变量p的地址后面的一个地址,还是4个字节

printf("%d\n", sizeof(&p[0]+1));//4 字符'a'后面一个字符'b'的地址,还是地址,大小为4个字节。



总结:(1)只要是地址,不论是整型数组还是字符数组,在32位平台上,都是4个字节。

   (2)地址+一个整数还是地址,大小为4个字节。

   (3)在计算strlen的时候,不包括0或者'\0'或者NULL。

   (4)在32位的平台上指针的大小是4个字节。



2 0