C语言中的sizeof和strlen的区别

2023-05-16

sizeof / strelen

先说结论,喜欢授之以渔的可以看后面结束。

1. 不同点

  1. sizeof 是单目运算符,strlen 是函数。
  2. sizeof 返回是 字串/字符所在变量,实际占用的内存大小。单位是字节。包含字串结尾的'/0'
  3. strlen 返回的是 字串/字符实际占用的大小,单位是字节,不包含字串结尾的'\0

2. 相似点

  1. sizeof and strlen 都包含在头问价<string.h> 文件中
  2. 都用来计算字符占用空间大小。

实例说明

理论是抽象的,我们来看一下实际代码中这二个函数的表现。

1. strlen

我们先看在头文件中的定义

  • strlen
    • 定义在头文件<string.h>
    • 可以看出是一个返回值为无符号整型的数值
size_t	 strlen(const char *__s);

实际上返回值是unsigned long类型的,这个类型有一个特点那就是非负。
在这里插入图片描述
这就会导致程序员在使用的过程中容易犯如下错误!!!!!

/*判断一*/
if(strlen(x)>= strlen(y))
{
}
/*判断二*/
if(strlen(x)- strlen(y)>= 0)
{
}

从表面上看,上面的两个判断表达式完全相等,但实际情况并非如此。其中,判断表达式一没什么问题,程序也能够完全按照预想的那样工作;但判断表达式二的结果就不一样了,它将永远是真,这是为什么呢?

原因很简单,因为函数 strlen 的返回结果是 size_t 类型(即无符号整型),而 size_t 类型绝不可能是负的。因此,语句“if(strlen(x)-strlen(y)>=0)”将永远为真。

2. sizeof

从下图中我们可以看到sizeof 实际上返回的类型为无符号长整型。
在这里插入图片描述

对 sizeof 而言,它本身是一个计算符,因为缓冲区已经用已知字符串进行了初始化,其长度是固定的,所以 sizeof 在编译时计算缓冲区的长度。也正是由于在编译时计算,因此 sizeof 不能用来返回动态分配的内存空间的大小。

3. 代码示例

#include <stdio.h>
#include <string.h>

int main(){
    
    printf("一个char是:%lu 字节\n", sizeof(char));  // 从这里可以知道char类型占一个字节
    char* name = "cds"; // char指针,占用3字节。
    printf("这里是一个指针的举例:%lu, %lu \n\n", sizeof(name), strlen(name));  // 无符号整形打印使用%lu

    char str[10] = "abcd"; // 内容是abcd四个字节,占用空间是10个字节。
    printf("这里是一个数组的举例: str: %lu, %lu \n\n", sizeof(str), strlen(str));    

    char bookName[] = "I Love You";
    // sizeof 返回实际占用的大小
    printf("sizeof: %lu\n", sizeof(bookName));
    // strlen 返回字符占用的大小
    printf("strlen: %lu\n", strlen(bookName));

    return 0;
}

运行结果:

在这里插入图片描述

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

C语言中的sizeof和strlen的区别 的相关文章

随机推荐

  • GPS 0183协议GGA、GLL、GSA、GSV、RMC、VTG解释 + 数据解析

    每个时区跨15 经度 以0 经线为界向东向西各划出7 5 经度 xff0c 作为0时区 即0时区的经度范围是7 5 W 7 5 E 从7 5 E与7 5 W分别向东 向西每15 经度划分为一个时区 xff0c 直到东11区和西11区 东11
  • selenium借助AutoIt识别上传文件Java篇

    https www cnblogs com testlc p 6069460 html 官方网站 xff1a https www autoitscript com site 从网站上下载AutoIt并安装 xff0c 安装完成在菜单中会看到
  • 【学习记录】贝叶斯滤波详解

    贝叶斯滤波详解 贝叶斯滤波的用途 xff08 Bayesian Filtering xff09 xff1a 贝叶斯滤波理论的应用可谓十分广泛 我们知道 xff0c 在机器人运动过程中 xff0c 有两个方面的信息来源 xff0c 一个是通过
  • c++好用的网站

    目录 洛谷www luogu com cn 有道小图灵https oj youdao com csp 维基https oi wiki org 信奥赛一本通http ybt ssoier cn 8088 index php 1 xff0c 洛
  • PX4uORB介绍[1]-常见IPC机制

  • ubuntu修改.bashrc文件

    使用如下命令修改 bashrc文件 xff1a gedit bashrc
  • PX4中文维基——光流部分

    觉得需要用到的内容复制在下面 光流 官网英文原文地址 xff1a http dev px4 io optical flow outdoors html Optical Flow uses a downward facing camera a
  • px4flow源码分析

    Flow c 计算光流用的是 SAD块匹配算法 第一部分是生成直方图 xff0c 第二部分是根据直方图来进行位移向量的计算 外部的 j i的for循环是采样点的循环 xff0c 内部的jj ii的循环是对于一个小邻域的采样 采样点是从 im
  • sudo apt-get update 与upgrade的用法

    在windows下安装软件 xff0c 我们只需要有EXE文件 xff0c 然后双击 xff0c 下一步直接OK就可以了 但在LINUX下 xff0c 不是这样的 每个LINUX的发行版 xff0c 比如UBUNTU xff0c 都会维护一
  • MATLAB标定工具箱的使用

    MATLAB标定工具箱的使用 用VS2012 43 OpenCV2 4 6写的双目标定的程序 xff08 其实就是跑的Samples xff09 xff0c 实验结果一直很不理想 xff0c 查看很多Blog xff0c 说可以先用MATL
  • C语言中%d,%o,%f,%e,%x的意义

    格式说明由 xff05 和格式字符组成 xff0c 如 xff05 d xff05 f等 它的作用是将输出的数据转换为指定的格式输出 格式说明总是由 xff05 字符开始的 不同类型的数据用不同的格式字符 格式字符有d o x u c s
  • 齐次坐标(homogeneous coordinate)

    就是将一个原本是n维的向量用一个n 43 1维向量来表示 二维点 x y 的齐次坐标表示为 hx hy h 由此可以看出 xff0c 一个向量的齐次表示是不唯一的 xff0c 齐次坐标的h取不同的值都表示的是同一个点 xff0c 比如齐次坐
  • win7下安装Ubuntu双系统(安装详解,及踩过的坑)

    前提 xff1a 网上用的u盘装双系统 xff0c 试了n次不是找到文件就是内存未分配 xff0c 各种错误 xff0c 在网上找相关的错误解决方法 xff0c 发现国内的很少 xff0c 国外的话遇到这种情况的也有 xff0c 也试了 x
  • MATLAB绘制三维曲线进行数据分析

    使用plot3函数 xff0c MATLAB官网教程 xff1a http cn mathworks com help matlab ref plot3 html s tid 61 gn loc drop plot3 x1 y1 z1 39
  • 关于STL的个人看法

    下面说的只是个人对STL的认识 不得不说 xff0c STL确实让数据结构的运用变得很简便 但我看来是有利有弊的 先说好处 xff0c 经过STL封装过的数据结构 xff0c 使用起来更加方便快捷 很多次网络赛 xff0c 用map xff
  • Ubuntu/Windows给pip换源

    文章目录 Windows给pip换源Ubuntu给pip换源 Windows给pip换源 打开appdata文件夹 xff0c 在资源管理器的地址栏输入 appdata 后回车 xff1a 或者win 43 r打开命令运行 xff0c 然后
  • The directory '/home/cds/.cache/pip/http' or its parent directory is not owned by the current user

    使用指令 span class token function sudo span span class token function chown span R root home span class token variable USER
  • window10将wsl升级到wsl2

    文章目录 微软 Win10 版本 2004 系统升级WSL到WSL2第一步 xff1a 打开系统虚拟机平台第二步 xff1a 安装WSL2第三步 xff1a 将wsl2设置为默认 WSL 2 中的新增功能将分发版版本设置为 WSL 1 或
  • conan-c++包管理工具安装及使用指南

    本篇文章的代码都在这里备份 文章目录 一 conan介绍1 1 简单介绍1 2 conna特点1 3 跨平台 二 conan全平台安装三 使用conan教程四 快速总结conan 一 conan介绍 跨平台c c 43 43 包管理工具py
  • C语言中的sizeof和strlen的区别

    sizeof strelen 先说结论 xff0c 喜欢授之以渔的可以看后面结束 1 不同点 sizeof 是单目运算符 xff0c strlen 是函数 sizeof 返回是 字串 字符所在变量 xff0c 实际占用的内存大小 单位是字节