关于strlen和sizeof

strlen是函数,在库string.h中,用于求字符串的长度(不包括结尾符‘\0’),也可以求字符数组的长度(该数组必须以\0结尾)。

sizeof是关键字。可以求得静态分配的内存的数组的长度,但不能求动态分配的内存的大小;当表达式作为sizeof的操作数时,返回表达式计算结果类型的大小;可以对函数调用求大小,返回函数返回值类型的大小;sizeof求得的结构体的大小并不等于各个成员大小的简单相加。

例1:char *p = "abcdef";//有\0

        char arr1[] = "abcdef";//有\0

        char arr2[] = {'a','b','c','d','e','f'};//无\0

sizeof(p) = 4;//p是指针类型,字节是4

sizeof(arr1) = 7;//arr1是字符数组,长度为7(包括\0)

sizeof(arr2) = 6;//总共给数组分配6个空间,大小为6

strlen(p) = 6;//求字符串长度,不包括\0

strlen(arr1) = 6;//求字符数组的长度,不算\0,为6

strlen(arr2) = 大于6的随机值;//strlen在arr2中找\0,找到为止

  若上述题目改为:char *p = "abcdef0\0";

                            char arr1[] = "abcdef0\0";

                            char arr2[] =  {'a','b','c','d','e','f','0','\0'};

计算结果依次是4,9,8,7,7,7

   解释:sizeof(arr1) = 9;//即使字符串末尾有\0,但是系统也会自动添加一个。

例2:int  a[] = {1,2,3,4};

        sizeof(a) = 16;//数组的大小

          sizeof(a+0) = 4;//&a[0]的大小

          sizeof(*a) = 4;//a[0]的大小

          sizeof(a+1) = 4;//&a[1]的大小

          sizeof(a[1]) = 4;

          sizeof(&a) = 4;//数组的地址,是数组首元素的地址,但是与a不同

          sizeof(&a+1) = 4;//是一个指针,&a+1是a的地址加上整个数组的大小

          sizeof(&a[0]) = 4;//地址的大小

         sizeof(&a[0]+1) = 4;//&a[1]的大小

         sizeof(*&a) = 16;//&a是整个数组的地址,*&a是这个数组,大小是16

例:char *p = "abcdef";(此例子是在例1的基础上扩充,详解指针变量)

     sizeof(p[0]) = 1//p是指向字符串首字符,p[0]就是a字符,大小是1.

     sizeof(&p) = 4//&p是p的地址,指针变量大小是4

    sizeof(*p) = 1//p是指向首字符,*p当然就是字符a,大小是1

    sizeof(&p+1) = 4//&p+1是指针变量,指向最后一个字符\0后边的位置

    sizeof(p+1) = 4//p+1是指针变量,大小是4.指向字符串中第二个字符

     sizeof(p) = 4//p值指针变量,大小是4

    strlen(p) = 6//求字符串长度,直到看到\0为止

    strlen(&p) = 随机值//&p是一段内存空间,指向p,我们求&p的长度,当然求得是随机值

     strlen(&p+1) = 随机值//是指&p后边一段内存的大小,找到\0为止,内存中的值我们未知,所以结果是随机值

    strlen(p + 1) = 5//p+1指向字符b,从b向后求长度,故为5

   图中p就是字符串首字符a的地址

    例3:

int main()
{
	int a[3][4] = { 0 };
	printf("%d\n", sizeof(a));//48
	printf("%d\n", sizeof(a[0][0]));//4
	printf("%d\n", sizeof(a[0]));//16
	printf("%d\n", sizeof(a[0] + 1));//4
	printf("%d\n", sizeof(a + 1));//4
	printf("%d\n", sizeof(&a[0] + 1));//4
	printf("%d\n", sizeof(*a));//16
	printf("%d\n", sizeof(a[3]));//16
	system("pause");
	return 0;
}

下边一句一句进行分析:

sizeof(a) = 48,数组名不发生降级。所以是12*4 = 48.

sizeof(a[0][0]) = 4.整形数的大小是4.(32位系统)

sizeof(a[0]) = 16.二维数组实际是一个以为数组,数组的每个元素都是一个一维数组,所以,a[0]是一个一维数组

的数组名,不发生降级,大小是16.

sizeof(a[0] +1) = 4.a[0] +1就是a[1],这里发生了降级,所以大小是4.

sizeof(a + 1) = 4,这里a+1指向这个数组最后一个元素后边的位置,此处发生了降级,大小是4.

sizeof(&a[0] +1) = 4,&a[0] +1就是&a[1],大小是4.

sizeof(*a) = 16,由于a就是&a[0],所以*a就是a[0],大小就是16.

sizeof(a[3]) = 16.这里虽然数组中并不存在a[3]这个元素,但是sizeof的求值是在编译阶段,编译器只是判断了a

[3]的类型,大小是16,同sizeof(a[0])。



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值