【C语言】一篇就够了(建议收藏)——超详解sizeof与strlen的用法(二)

简介: 【C语言】一篇就够了(建议收藏)——超详解sizeof与strlen的用法(二)

字符数组

sizeof用法

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

   printf("%d\n", sizeof(arr));

   printf("%d\n", sizeof(arr+0));

   printf("%d\n", sizeof(*arr));

   printf("%d\n", sizeof(arr[1]));

   printf("%d\n", sizeof(&arr));

   printf("%d\n", sizeof(&arr+1));

   printf("%d\n", sizeof(&arr[0]+1));


运行结果:

微信图片_20220415160801.png

解:

  printf("%d\n", sizeof(arr)); 6


此时此刻,sizeof(数组名) 计算的是整个数组的大小,这个数组有6个char类型元素,所以大小为6字节


  printf("%d\n", sizeof(arr+0)); 4/8


这里的arr表示首元素地址,+0之后还是首元素a的地址,只要是地址,所以大小为4/8字节


  printf("%d\n", sizeof(*arr)); 1


arr是首元素地址,对首元素地址解引用,即得到首元素 a ,a是char类型,所以大小为1


  printf("%d\n", sizeof(arr[1])); 1


arr[1]表示的就是第二个元素b,大小为1


  printf("%d\n", sizeof(&arr)); 4/8


这里&arr取的是整个数组的地址,是地址,所以大小为4/8字节


  printf("%d\n", sizeof(&arr+1)); 4/8


&arr是数组的地址,&arr+1是数组的地址+1,虽然相当于跳过了整个数组,但还是一个地址,所以大小还是4/8字节


  printf("%d\n", sizeof(&arr[0]+1)); 4/8


&arr[0]是首元素地址,+1后取到的是第二位元素的地址,也就是 b 的地址,大小为4/8字节;


strlen的用法


strlen库函数是什么?请看下图

微信图片_20220415161003.png

请看题:


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

   printf("%d\n", strlen(arr));

   printf("%d\n", strlen(arr+0));

   printf("%d\n", strlen(*arr));

   printf("%d\n", strlen(arr[1]));

   printf("%d\n", strlen(&arr));

   printf("%d\n", strlen(&arr+1));

   printf("%d\n", strlen(&arr[0]+1));


解:


  printf("%d\n", strlen(arr)); 结果是未知数即随机值


因为arr是首元素地址,strlen函数拿到一个地址,从这个地址一路往后读取计数,直到读到 \0 为止,然鹅在arr这个字符数组里,没有 \0 让其读取,所以它会顺着内存地址一直往后,具体哪个内存单元里存有 \0 是未知的,所以长度结果就是个随机未知数


printf("%d\n", strlen(arr+0)); 结果是随机值

arr是首元素地址,+0后还是首元素地址,情况与上一题同理,结果是随机数


  printf("%d\n", strlen(*arr)); 系统报错


*arr是对首元素地址解引用,得到的就是 字符a ,strlen接收到的其实是字符a的ASCII码值97 ,这个97不是一个合法地址,是个野指针,所以这行代码会报错


  printf("%d\n", strlen(arr[1])); 系统报错


arr[1]是第二位元素,就是字符 b ,strlen接收到的是字符 b 的ASCII码值98,与上同理,会报错


  printf("%d\n", strlen(&arr)); 随机值


&arr取到的是整个数组的地址,它的实际上等于首元素地址,由于strlen函数的类型是char* ,传过来之后会进行一个类型的隐式转换,地址类型可能会不一样,但是strlen能接收这个地址,即接收到首元素地址并由此往后计数,所以结果也是一个随机值


   printf("%d\n", strlen(&arr+1));结果是一个随机值,与strlen(&arr)得到的随机值相差6


&arr是取整个数组的地址,+1是跳过整个数组,拿到的是整个数组之后的地址,所以同理,结果也是一个随机值,只不过这个随机值与strlen(arr)得到的随机值相差6,如图:

微信图片_20220415161400.png


  printf("%d\n", strlen(&arr[0]+1)); 随机值


&arr[0]是取第一个元素地址,+1是取到第二个元素地址,即从 字符b 开始向后计数,但是不知道 \0 会出现在后边内存的哪个位置,所以结果也是随机数

————————————————

版权声明:本文为CSDN博主「敲代码的布莱恩特」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/DerrickWestbrook/article/details/120114553

相关文章
|
1月前
|
C语言
如何在C 语言中使用运算符sizeof
如何在C 语言中使用运算符sizeof
12 0
|
1月前
|
C语言
【C语言】指针进阶之sizeof和strlen函数的对比
【C语言】指针进阶之sizeof和strlen函数的对比
|
1月前
|
算法 编译器 C语言
C语言猜数字小游戏(也包含python实现的用法)
本文基于VS2022、pycharm和前面的知识,写一个凭借分支与循环的小游戏,比如: 写一个猜数字游戏 游戏要求: 电脑自动生成1~100的随机数 玩家猜数字,猜数的过程中,根据猜测数据的大小给出大了或小了的反馈,直到猜对,游戏结束 在pyhton中生成随机数是比较简单的,可以直接导入random的包,直接生成随机数,导致写猜数字小游戏变成了判读语句和循环语句嵌套就能写出来,所以我不做过多的介绍了,可以直接看后面的代码展示,想了解更多的python可看python的基础知识,这里面有我在学习python的过程中写的笔记
31 0
|
4月前
|
C语言
C语言转义字符第二篇和strlen库函数的使用
C语言转义字符第二篇和strlen库函数的使用
|
4月前
|
编译器 C语言
C语言的转义字符,转义字符的用法
C语言的转义字符,转义字符的用法
|
3天前
|
C语言
C语言:字符函数和字符串函数(strlen strcat strcmp strncmp等函数和模拟实现)
C语言:字符函数和字符串函数(strlen strcat strcmp strncmp等函数和模拟实现)
|
24天前
|
存储 C语言
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现1
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现
|
1月前
|
存储 编译器 C语言
c语言——关于不使用strlen求字符串长度
在日常生活中,我们有时会遇到这样的题目,不使用strlen函数求字符串长度,关于这种问题,我们其实有很多的方法来解决,首先我们要了解strlen
30 0
|
1月前
|
存储 C语言
c语言中strlen与sizeof的区别(指针面试题详解帮你深度区分!)
c语言中strlen与sizeof的区别(指针面试题详解帮你深度区分!)
|
1月前
|
C语言
C语言中关键字static的三种用法
C语言中关键字static的三种用法