【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

相关文章
|
IDE 编译器 开发工具
【C语言】全面系统讲解 `#pragma` 指令:从基本用法到高级应用
在本文中,我们系统地讲解了常见的 `#pragma` 指令,包括其基本用法、编译器支持情况、示例代码以及与传统方法的对比。`#pragma` 指令是一个强大的工具,可以帮助开发者精细控制编译器的行为,优化代码性能,避免错误,并确保跨平台兼容性。然而,使用这些指令时需要特别注意编译器的支持情况,因为并非所有的 `#pragma` 指令都能在所有编译器中得到支持。
1818 41
【C语言】全面系统讲解 `#pragma` 指令:从基本用法到高级应用
|
C语言
C语言判断逻辑的高阶用法
在C语言中,高级的判断逻辑技巧能显著提升代码的可读性、灵活性和效率。本文介绍了六种常见方法:1) 函数指针,如回调机制;2) 逻辑运算符组合,实现复杂条件判断;3) 宏定义简化逻辑;4) 结构体与联合体组织复杂数据;5) 递归与分治法处理树形结构;6) 状态机管理状态转换。通过这些方法,可以更高效地管理和实现复杂的逻辑判断,使代码更加清晰易懂。
678 88
|
C语言
【C语言】sizeof 关键字详解
`sizeof` 关键字在C语言中用于计算数据类型或变量在内存中占用的字节数。它是一个编译时操作符,对性能没有影响。`sizeof` 可以用于基本数据类型、数组、结构体、指针等,了解和正确使用 `sizeof` 对于内存管理和调试程序非常重要。
1261 2
|
存储 缓存 编译器
【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)(下篇)
scanf处理⽤⼾输⼊的原理是,⽤⼾的输⼊先放⼊缓存,等到按下回⻋键后,按照占位符对缓存进⾏解读。 解读⽤⼾输⼊时,会从上⼀次解读遗留的第⼀个字符开始,直到读完缓存,或者遇到第⼀个不符合条件的字符为⽌。
855 2
|
存储 C语言
【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)(上篇)
printf 的作⽤是将参数⽂本输出到屏幕。它名字⾥⾯的 f 代表 format (格式化),表⽰可以定制输出⽂本的格式。
529 1
|
Serverless 编译器 C语言
【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
314 0
|
存储 C语言
c语言scanf函数用法
c语言scanf函数用法
|
存储 C语言
C语言中static关键字的作用与用法解析
C语言中static关键字的作用与用法解析
|
C语言
深入探索C语言中的sizeof关键字
深入探索C语言中的sizeof关键字
303 0
|
C语言
【C语言基础篇】字符串处理函数(一)strlen的介绍及模拟实现
【C语言基础篇】字符串处理函数(一)strlen的介绍及模拟实现