C语言:sizeof和strlen计算字符串大小

2023-05-16

大家清楚 sizeof 和 strlen 的区别吗?

sizeof是运算符,确定的是字符所占空间大小,参数可以有数组、指针、类型、对象、函数等。

strlen是C语言的标准库函数,确定是字符串的大小,目的是找到\0,\0之前出现多少个字符,字符串长度就是几,如果找不到可能就是随机值。

下面有几组例题:
大家可以自行验证,每一行后面都有我写的答案和解析.
1、字符串放进数组里
sizeof用法计算

char arr[]="abcdef";
printf("%d\n",sizeof(arr));//7 sizeof(arr)计算的是数组的大小,因为字符串里面结尾有个\0,所以大小是7字节
printf("%d\n",sizeof(arr+0));//4/8 arr+0没有变化,计算的还是数组地址的大小,是4/8字节
printf("%d\n",sizeof(*arr));//1 *arr是首元素,所以计算的是首元素的大小,也就是1字节
printf("%d\n",sizeof(arr[1]));//1 arr[1]是数组第二个元素,所以计算的大小还是1字节
printf("%d\n",sizeof(&arr));//4/8 &arr是取数组地址,是地址那就是4/8字节
printf("%d\n",sizeof(&arr+1));//4/8 &arr+1取的是下一个数组的地址,但是还是地址,所以是4/8字节
printf("%d\n",sizeof(&arr[0]+1));//4/8 &arr[0]+1取的是第二个元素的地址,只要取的是地址,那就是4/8字节

strlen用法计算

printf("%d\n",strlen(arr));//6 strlen计算的是\0前面字符的大小,也就是6字节
printf("%d\n",strlen(arr+0));//6 arr+0没有变化,还是计算从数组首地址往后的大小,还是6字节
printf("%d\n",strlen(*arr));//程序错误 *arr是首元素,等于把97作为地址传过去寻找\0,非法访问,会挂掉
printf("%d\n",strlen(arr[1]));//程序错误 arr[1]表示第二个元素,也就是把b(98)作为地址传过去,非法访问,跟上一个一样
printf("%d\n",strlen(&arr));//6 &arr是取首元素地址,所以计算从首元素地址开始,共6个字节
printf("%d\n",strlen(&arr+1));//随机值 &arr+1表示下一个数组,而下一个数组有啥谁也不知道,所以是随机值
printf("%d\n",strlen(&arr[0]+1));//5 &arr[0]+1表示从第二个元素地址开始,所以比第一个少了一个字节,也就是5字节

2、字符串放进指针里
sizeof用法计算

char*p="abcdef";//这里指的是把常量字符串a的地址放进p里,并不是把abcdef放进p里
printf("%d\n",sizeof(p));//4/8 计算指针变量p的大小,而p是地址,所以是4/8
printf("%d\n",sizeof(p+1));//4/8 p+1计算的是字符b的地址,所以是4/8
printf("%d\n",sizeof(*p));//1 *p就是解引用得到a,所以是1个字节
printf("%d\n",sizeof(p[0]));//1 p[0]=*(p+0)=a,所以还是解引用a,也就是1个字节
printf("%d\n",sizeof(&p));//4/8 取p地址,是地址就是4/8
printf("%d\n",sizeof(&p+1));//4/8 取b的地址,是地址就是4/8
printf("%d\n",sizeof(&p[0]+1));//4/8 同样是取b地址,4/8字节

strlen用法计算

printf("%d\n",strlen(p));//6 从a地址开始寻找\0,所以是6个字节
printf("%d\n",strlen(p+1));//5 p+1就是b的地址,从b地址寻找\0,也就是5个字节
printf("%d\n",strlen(*p));//程序错误 *p就是解引用得到a,传过去的不是地址,是97,所以非法访问会报错
printf("%d\n",strlen(p[0]));//程序错误 p[0]同样是得到a,传过去的不是地址,会报错
printf("%d\n",strlen(&p));//随机值 &p是取地址,a只是传给了p,但并不代表p的地址后面就是bcdef,所以p地址后面是随机的
printf("%d\n",strlen(&p+1));//随机值 &p+1是跳过了p的地址,而后面地址是啥谁也不知道,所以是随机的
printf("%d\n",strlen(&p[0]+1));//5 &p[0]+1表示字符串第二个字符b,从b开始寻起\0,所以是5个字节

sizeof和strlen看起来简单,但实际上使用的时候得出的答案又是否符合你的期望呢

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言:sizeof和strlen计算字符串大小 的相关文章

  • PHP 不使用 strlen() 的字符串长度

    刚刚浏览了最新版本的 PHP 编码标准 有一些东西引起了我的注意 编码标准 4 规定 在编写处理字符串的函数时 请务必记住 PHP 保存每个字符串的长度属性 并且不应该使用 strlen 计算它 我一直使用 strlen 也许只是晚了 但是
  • 在函数上使用 sizeof 的输出[重复]

    这个问题在这里已经有答案了 为什么下面的代码给出 include
  • sizeof 运算符给出了 C# 中结构的额外大小[重复]

    这个问题在这里已经有答案了 我正在尝试使用 sizeof 运算符检查所有变量 值类型 的大小 我经历了其中之一msdn 文章哪里写着 对于所有其他类型 包括结构体 sizeof 运算符只能在不安全的代码块中使用 而且结构不应包含任何引用类型
  • strlen 函数内部如何工作?

    如何strlen 内部工作 该功能是否存在固有的错误 strlen通常通过计算字符串中的字符直到 0字符被发现 规范的实现是 size t strlen char str size t len 0 while str 0 str len r
  • 如何计算 char 数组中的元素数量?

    我试图计算数组中的元素数量 并被告知该行 int r sizeof array sizeof array 0 会给我数组中元素的数量 我发现该方法确实有效 至少对于 int 数组而言 然而 当我尝试这段代码时 事情就崩溃了 include
  • 如何在不知道c中大小的情况下迭代数组[重复]

    这个问题在这里已经有答案了 我有一个指向 C 中数组的指针 我想对其进行迭代 但我不知道其大小 int array 我不确定应该如何进行 我想我应该尝试通过以下方式找到尺寸 int array size sizeof array sizeo
  • 保证 char、wchar_t、char16_t、char32_t 的大小排序

    C 标准是否对大小 以字节为单位 的排序提供任何保证 char wchar t char16 t char32 t 欢迎任何标准摘录 例如 我是否可以保证 sizeof char lt sizeof wchar t lt sizeof ch
  • strlen() 不适用于字符串变量

    include
  • Nullable 的大小是多少?

    所以 实际上有几个问题 An int Int32 被指定为 显然 32 位 怎么样int Nullable
  • boost::multi precision::uint128_t sizeof 是 24

    基础数学 128 8 16 的说法不同 我有点失望 想要一些答案 因为从我习惯的情况来看 该符号 type num of bytes t 不仅描述了您可以放入变量的数据量 但是也跨平台固定可变大小 恕我直言 后者更为重要 我究竟做错了什么
  • GCC中strlen()的实现在哪里?

    谁能指出我的定义strlen 在海湾合作委员会 我已经 grep 4 4 2 版本大约半个小时了 同时疯狂地谷歌搜索 我似乎找不到在哪里strlen 已实际实施 你应该在 glibc 中查找 而不是 GCC 它似乎是在strlen c 这是
  • 空向量的大小

    运行以下程序g 4 8 2在 32 位 Linux 系统上给出输出 12 vector
  • 指针数组的大小

    我对 sizeof 运算符有疑问 Code 1 int main int p 10 printf d sizeof p output 40 return 0 Code 2 int main int p 10 printf d sizeof
  • 在C中,malloc(256)和malloc(sizeof(char)*256)等价吗?

    我看到人们经常编写 C 代码 例如 char ptr malloc sizeof char 256 这真的有必要吗 标准说sizeof char 1根据定义 这样写是不是有意义 char ptr malloc 256 是的 C 定义了siz
  • sizeof如何知道操作数数组的大小?

    这可能是一个愚蠢的问题 但是当您不传入数组中的元素数量时 sizeof 运算符如何知道数组操作数的大小 我知道它不会返回数组中的总元素 而是返回字节大小 但为了得到它 它仍然必须知道数组何时结束 只是好奇这是如何工作的 sizeof在编译时
  • Go 中的结构体大小

    我正在研究 Go 它看起来很有前途 我想弄清楚如何获取 go 结构的大小 例如 例如 type Coord3d struct X Y Z int64 我当然知道它是 24 个字节 但我想以编程方式知道它 您有任何想法如何做到这一点吗 罗杰已
  • 为什么 Rust 中的 C strlen() 也会计算 print 中的字符串切片! `s` 变量之后的宏?

    所以我只是在 Rust 中修改 C 库 我发现以下代码 extern crate libc use libc c char c int size t extern C fn printf fmt const c char gt c int
  • 为什么没有成员变量的C++类会占用空间?

    我发现 MSVC 和 GCC 编译器都为每个类实例分配至少一个字节 即使该类是没有成员变量 或只有静态成员变量 的谓词 下面的代码说明了这一点 include
  • 具有灵活数组成员的结构的大小

    Given struct Foo uint32 t a uint32 t b What is sizeof Foo 它是实现定义的行为还是未定义的行为 C 和 C 的答案是否不同 编译器将忽略灵活数组成员 因为它不存在 C11 6 7 2
  • strlen - 字符串的长度有时会增加 1

    我正在做一些 C 智力题 在大多数情况下 我能够找到正确的答案 但我遇到了问题 我通过使用编译器知道正确的答案 但我不知道原因 看一下代码 char c abc 012 0x34 什么会strlen c 返回 使用标准 C 编译器 我的编译

随机推荐

  • 错题汇总1

    1 以下程序的运行结果是 xff08 xff09 int main void printf 34 s 5 3s n 34 34 computer 34 34 computer 34 return 0 A computer puter B c
  • 使用C/C++制作信息管理系统(demo)

    要求 xff1a 在windows环境下使用Vistual studio以C C 43 43 语言编译一个具有基础框架的客户信息管理系统 必须使用到封装 继承 map容器 SQL数据库技术 我 是 分 割 线 未经过UI处理的基础系统功能效
  • 错题汇总2

    1 下列程序的打印结果是 char p1 15 61 34 abcd 34 p2 61 34 ABCD 34 str 50 61 34 xyz 34 strcpy str 43 2 strcat p1 43 2 p2 43 1 printf
  • C++之继承初识(不包含虚拟继承)

    C 43 43 是一种面向对象的语言 xff0c 而面向对象 xff0c 有着三大特征 封装 xff0c 继承 xff0c 多态 关于封装 xff0c 在我的其它博客中已经有过简单的介绍了 这里我将简单叙述一下面向对象的三大特征之二 继承
  • C++之虚拟继承与继承的小总结

    本来是想将虚拟继承的部分写在上一篇的 xff0c 但是虚拟继承的分析实在有些复杂 xff0c 为了方便我自己回顾 xff0c 就干脆单写一篇吧 我们之前说过了 xff0c 虚拟继承可以解决菱形继承的二义性以及数据冗余的问题 xff0c 实际
  • C++之初识多态(Visual Studio 2019)

    此文章关于多态的代码全部是使用Visua Studio2019 x86 实现的 xff0c C 43 43 多态在不同编译器中的实现细节可能不同 xff0c 所以部分情况下相同代码运行结果可能不同 xff0c 在此声明 目录 多态的概念 多
  • C工程与寄存器封装(lv9-day13)

    文章目录 C工程与寄存器封装1 C语言工程简介2 启动文件3 C语言实现LED闪烁3 1 C语言与汇编分别是怎么操作寄存器的3 2 用C语言实现LED闪烁 4 寄存器的封装4 1 第一种封装方式 xff08 宏定义 xff09 4 2 第二
  • C++中auto的用法

    目录 1 auto初始化 1 1auto还可以与指针 xff0c 引用以及const进行组合 xff0c 但是在不同场景下会有相对应的推导规则 1 1 1指针和引用 1 1 2const 2 增强for循环 3 auto的限制 C 43 4
  • 自定义函数实现strcat函数功能

    strcat函数定义 字符串追加 连接函数 它的功能就是在一个字符串后面追加上另外一个字符串 char strcat char destination const char source 特点 xff08 与strcpy类似 xff09 x
  • STM32实现智能加湿

    开发前的准备需要如下的材料 xff1a 雾化模块1个 STM32F103开发板一个 风扇驱动模块1个 xff08 可用继电器代替 xff09 我们采用的继电器是低电平触发的所以我们在使用的时候只用给它一个低电平的信号就可以控制它了 USB转
  • Qt项目实战:愤怒的小鸟(联机版)

    前言 本文章会详细介绍难点的内容 xff0c 不附带全部源码 xff0c 会将关键代码进行展示 因为只有截图 xff0c 这里在每一个动作和界面都添加了音效与BGM 同时附加了CG展示 素材和音效全部放在下面了 xff0c 需要可自行提取
  • Ubuntu中安装openCV时Cmake问题解决

    1 执行Cmake的语句指令 sudo cmake D CMAKE BUILD TYPE 61 Release D CMAKE INSTALL PREFIX 61 usr local 2 当执行完上述指令后遇见以下问题解决策略 问题1 xf
  • 使用 RGB-D 相机(Astra)实现 YOLO v3 实时目标检测

    设备和环境 xff1a 奥比中光RGB D相机 xff08 Astra xff09 xff1b Ubuntu16 04 首先 xff0c 先将自己的RGB D相机的环境与依赖构建好 xff0c 然后进行以下步骤构建darknet ros 1
  • Arduion应用U8g2库实现字符滚动效果

    由于U8g2库中没有可以位移的函数 xff0c 所以简单编写了一个可以实现字符滚动的代码 主要是为了记录一下自己学习Arduion的过程 算是一个记事本吧 xff01 当然如果你对于这方面有所需求 xff0c 可以拿去使用 主要是利用显示器
  • C语言老鼠走迷宫(单路径)算法详细讲解

    最近在学习C语言的一些经典算法 xff0c 其中遇到了一点困难 xff0c 导致卡进度了 琢磨了很久 xff0c 在绘制流程图时 xff0c 突然灵感大开理解了 xff0c 老鼠走迷宫算法的奇妙 所以写了这个 xff0c 一来是方便以后右和
  • 关于二分搜索法条件判断的研究

    最近在写二分搜索法时 xff0c 发现了几个现象 xff0c 在不同的条件设定之下 xff0c 系统会出现几种bug xff1a 1 当搜索的值 lt 最小值 时系统都会一直在循环内执行 2 当搜索的值 gt 最大值 时系统都会一直在循环内
  • C++ 库函数<string>示例

    最近在学C 43 43 自己整理了一部分C 43 43 库函数 lt string gt 的一些 函数 主要都是C 43 43 的 想到以后可能会用到 所以打算记录一下 方便自己也方便了大家 在啃这些函数的时候有很多借鉴之处 xff0c 在
  • 两台电脑间的串口通信

    目录 一 准备工作 二 实验过程 三 实验结果 一 准备工作 1 两台笔记本电脑 2 2个usb转串口模块 3 杜邦线若干 4 秒表 二 实验过程 两个串口线分别连接两台电脑 连线方式 xff1a 3V3 3V3 xff0c GND GND
  • c++ primer plus学习笔记(1)——基础知识

    本人还有一星期要开始期末考试了 xff0c 复习c 43 43 时顺便挖个坑 xff0c 之后会详细更新 目录 1 初识源代码 1 1 c 43 43 程序的产生 1 2 代码例 1 3 标记 空白 2 简单数据类型 2 1 变量名 2 2
  • C语言:sizeof和strlen计算字符串大小

    大家清楚 sizeof 和 strlen 的区别吗 xff1f sizeof是运算符 xff0c 确定的是字符所占空间大小 xff0c 参数可以有数组 指针 类型 对象 函数等 strlen是C语言的标准库函数 xff0c 确定是字符串的大