C语言中sizeof()和strlen()的区别

2023-11-18

《sizeof》

(一)、sizeof的基本概念

sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号
内的类型名。操作数的存储大小由操作数的类型决定。

(二)使用方法

1、用于数据类型

sizeof使用形式:sizeof(type) ,如sizeof(int)

2、用于变量
sizeof使用形式:sizeof(var_name)或sizeof var_name

变量名可以不用括号括住。如sizeof (var_name),sizeof var_name等都是正确形式。带上括号的用法更普遍。建议像我们初学的小白们大家都带上括号比较好。嘻嘻!!!
注意:sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。
如sizeof(max)若此时变量max定义为int max(),sizeof(char_v) 若此时char_v定义为char char_v [MAX]且MAX未知,sizeof(void)都不是正确形式。

(三)、常用类型的对齐方式

类型 对齐方式(变量存放的起始地址相对于结构的起始地址的偏移量)
char 偏移量必须为sizeof(char)即1的倍数
int 偏移量必须为sizeof(int)即4的倍数
double 偏移量必须为sizeof(int)即4的倍数
short 偏移量必须为sizeof(short)即2的倍数
float 偏移量必须为sizeof(float)即4的倍数

(四)、sizeof用法总结

1. 参数为数据类型或者为一般变量。

例如sizeof(int),sizeof(long)等等。这种情况要注意的是不同系统系统或者不同编译器得到的结果可能是不同的。例如int类型在16位系统中占2个字节,在32位系统中占4个字节,在64位系统中占8个字节。

2. 参数为数组或指针
下面举例说明.
int a[50];         //sizeof(a)=4*50=200; 求数组所占的空间大小

int *a = new int[50]; // sizeof(a)=4; a为一个指针,sizeof(a)是求指针的大小,在32位系统中,当然是占4个字节。

小秘诀:sizeof(数组名):求取的是数组的整体大小哦

&数组名:求取的是数组的整体大小哦

其他情况均为数组首元素的地址

《strlen》

C库函数 size_t strlen(const char *str) 计算字符串str的长度,但不包括终止空字符

1、声明

以下是声明的strlen() 函数。

size_t strlen(const char *str)
2、参数

str – 这是字符串的长度要计算的

3、返回值

这个函数返回字符串的长度。

例子

下面的例子显示使用strlen() 函数。

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

int main ()
{
  char str[50];
  int len;

  strcpy(str, "guozhaozhao");

  len = strlen(str);
  printf("Length of |%s| is |%d|", str, len);

  return(0);
}

这里写图片描述

例题解析

字符数组例题

#inlcude<stdio.h>
#include <string.h>
int main()
{   
    char *p = "abcdef";//字符串
    char arr1[] = "abcdef";//字符串
    char arr2[] = {'a','b','c','d','e','f'};//6个字符。没有\0
    printf("%d\n",sizeof(p));//结果为:4  p为一个指针变量,所有类型的指针的大小都是四个字节。(32系统)
    printf("%d\n",sizeof(arr1));//结果为:7 arr1为数组名,放进去求的是数组的总大小。记住arr1中的字符串还包含有\o。
    printf("%d\n",sizeof(arr2));//结果为:6
    printf("%d\n",strlen(p));//结果为:6  \0不统计
    printf("%d\n",strlen(arr1));//结果为:6 \0不统计
    printf("%d\n",strlen(arr2));//结果为:没有\0 是一个随机值
    return 0;
}
#inlcude<stdio.h>
#include <string.h>
int main()
{   
    char *p = "abcdef0\0";//字符串
    char arr1[] = "abcdef0\0";//字符串
    char arr2[] = {'a','b','c','d','e','f','0','\0'};
    printf("%d\n",sizeof(p));//结果为:4  
    printf("%d\n",sizeof(arr1));//结果为:9 
    printf("%d\n",sizeof(arr2));//结果为:8
    printf("%d\n",strlen(p));//结果为:7 
    printf("%d\n",strlen(arr1));//结果为:7 
    printf("%d\n",strlen(arr2));//结果为:7
    return 0;
}

一维数组的例题

#inlcude<stdio.h>
#include <string.h>
int main()
{
    int a[] = {1,2,3,4};
    printf("%d\n",sizeof(a));//结果为:16 放的四个整型所以是4*4=16。
    printf("%d\n",sizeof(a+0));//结果为:4 第一个元素的地址。
    printf("%d\n",sizeof(*a));//结果为:4 第一个元素
    printf("%d\n",sizeof(a+1));//结果为:4 第二个元素的地址。
    printf("%d\n",sizeof(a[1]));//结果为:4 第二个元素。
    printf("%d\n",sizeof(&a));//结果为:4 数组的地址。
    printf("%d\n",sizeof(&a+1));//结果为:4 数组末尾再后面空间的地址。
    printf("%d\n",sizeof(&a[0]));//结果为:4 第一个元素的地址。
    printf("%d\n",sizeof(&a[0]+1));//结果为:4 第二个元素的地址。
    printf("%d\n",sizeof(*&a));//结果为:16 &a取出来的是整个数组的地址,对数组的地址进行* 就成了整个数组了。
    return 0;
}

二维数组的例题

#include<stdio.h>
#include<string.h>
int main()
{ 

    int a[3][4] = {0};          
    printf("%d\n",sizeof(a));   //48       整个二维数组的大小
    printf("%d\n",sizeof(a[0][0])); //4    下标为a[0][0]的长度,也就是第一行第一个元素的大小
    printf("%d\n",sizeof(a[0]));    //16   第1行的大小 第一行有四个每个又为整型 所以为16
    printf("%d\n",sizeof(a[0]+1));  //4    第一行第二个元素的地址   
    printf("%d\n",sizeof(a+1));     //4    第二行的地址   
    printf("%d\n",sizeof(&a[0]+1)); //4 第1行的地址的长度       
    printf("%d\n",sizeof(*a));      //16     第0行的长度
    printf("%d\n",sizeof(a[3]));    //16     越界了但是还是会计算出第三行的长度。
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 从Docker到Kubernetes——K8s网络核心原理

    文章目录 Dokcer的网络模型 kubernetes网络核心原理 IP per Pod模型 Kubernetes网络插件flannel Dokcer的网络模型 Dokcer默认使用单主机的网络方案 它默认创建一个名为docker0的网桥

随机推荐

  • DateFormat类

    DateFormat类 DateFormat类用于将日期格式化为字符串或者将用特定格式显示的日期字符串转换成一个Date对象 DateFormat是一个抽象类 不能直接被实例化 提供了一系列静态方法来获取DateFormat类的实例对象 D
  • 一文读懂「Attention is All You Need」

    前言 2017 年中 有两篇类似同时也是笔者非常欣赏的论文 分别是 FaceBook 的Convolutional Sequence to Sequence Learning和 Google 的Attention is All You Ne
  • Android实战——Zxing实现二维码扫描

    Zxing实现二维码扫描 前言 本篇文章从初学者的角度出发 从一个不知道对二维码扫描怎么下手的工作者 需要一个简单的扫描功能的话 可以阅读该篇文章 作为Google开源框架Zxing 里面的文件很大 这里主要讲的是精简ZXing项目后只保留
  • 数据库字典表设计

    数据库字典表设计 村长大神 发表于2年前 在稍大一些的项目中 我们总是需要管理各种各样的类型类型数据 如商品类型 游戏类型 对于这些类型的管理类似 如果为每 一种类型都建立一张表去维护 而在项目中 正常
  • H.264视频码流解析

    原理 H 264原始码流 又称为 裸流 是由一个一个的NALU组成的 他们的结构如下图所示 其中每个NALU之间通过startcode 起始码 进行分隔 起始码分成两种 0x000001 3Byte 或者0x00000001 4Byte 如
  • 在vs2005中,写c程序,所有的局部变量都要放在函数体的最前面

    没有放在最前面的源码 怎么办呢 修改量太大
  • matlab动态神经网络进行时间序列预测分析

    matlab动态神经网络进行时间序列预测分析 时间序列预测问题分类 有y 无x 即 y t f y t 1 y t 2 y t f y t
  • Pycharm上Modify Run Configuration的使用方法,带参数配置

    前言 我们在搭建yolo系列目标检测模型时 往往需要对代码进行逐步调试 及时发现错误 所以本文在pycharm的基础上 对yolov6中的infer py进行逐步调试 首先我们在conda环境一切准备就绪的情况下 能在终端tenminal中
  • 【UE5 Cesium】11-Cesium for Unreal 切换Dynamic Pawn为其它Pawn

    前言 我们知道在Cesium for Unreal中默认使用的是DynamicPawn来浏览地图场景 DynamicPawn适用全球浏览 可以按自定义曲线进行飞行 但是DynamicPawn是使用的是地理参考坐标系 并不是标准的UE坐标系
  • iOS利用九切片进行切图UI不会变形

    p 1 手写代码 p p p UIImageView svRect UIImage backgroundImage UIImageimageNamed bg png backgroundImage backgroundImageresiza
  • 《机器学习》读书笔记2--线性模型

    目录 线性模型基本形式 线性回归 对数几率回归 线性判别分析 多分类学习 类别不平衡问题 ps 写在前面 本文是在参加datawhale组队学习 学习周志华老师的 机器学习 过程的学习笔记 文中出现的图片均引自 机器学习 机器学习 是初学者
  • AI绘画Stable Diffusion原理之扩散模型DDPM

    前言 传送门 stable diffusion Git 论文 stable diffusion webui Git Google Colab Notebook部署stable diffusion webui Git kaggle Noteb
  • 量化交易框架开发实践(一)

    量化交易平台指支持通过对数据进行多维度的定量分析 结合发现的特征定制策略 并能够基于历史数据对策略进行回测 最后支持实盘买卖的交易平台 从业务流上看 量化交易可以分解成 行情获取 gt 数据清洗 gt 指标计算 gt 策略开发 gt 策略回
  • RobotStudio ABB 仿真软件过期 后的处理

    首先查看当前是在试用期还是已经过期了 查看方法如下 在打开软件后的首页找到 帮助 右侧会显示当前授权状态是否为 试用 1 如果当前在试用期内 可以通过直接修改注册表方式 修改方法 找到如下位置 HKEY LOCAL MACHINE SOFT
  • 正则表达式匹配中* . c++实现

    题目描述 请实现一个函数用来匹配包括 和 的正则表达式 模式中的字符 表示任意一个字符 而 表示它前面的字符可以出现任意次 包含0次 在本题中 匹配是指字符串的所有字符匹配整个模式 例如 字符串 aaa 与模式 a a 和 ab ac a
  • QT 怎么导入qss文件?

    方式一 比较常见的方法 QFile file qss psblack css if file open QFile ReadOnly QString qss QLatin1String file readAll qApp gt setSty
  • 提高电脑寿命的维护技巧与方法分享

    在维护电脑运行方面 我有一些自己觉得非常有用的技巧和方法 下面我将分享一些我常用的维护技巧 并解释为什么我会选择这样做以及这样做的好处 首先 我经常清理我的电脑内部的灰尘 电脑内部的灰尘会影响散热效果 导致电脑发热严重甚至性能下降 因此 定
  • Google Colab 上部署 Stable Diffusion Web UI

    什么是 Stable Diffusion Web UI Colab Stable Diffusion 是 Stability AI 推出的一个基于深度学习技术文字生成图片AI模型 Stable Diffusion Web UI 是一个强大好
  • [技术经理]03 到底是能力重要,还是态度重要?

    对于一个技术团队而言 团队里面的人员是最最重要的财富 人员的招聘和人员的管理是技术经理最重要的工作之一 但是 事实也是 没有什么问题比人的问题更难处理的了 我先讲两个发生在我们团队里面的事件 今年上半年的时候 我们团队同时入职了两名前端开发
  • C语言中sizeof()和strlen()的区别

    sizeof 一 sizeof的基本概念 sizeof操作符以字节形式给出了其操作数的存储大小 操作数可以是一个表达式或括在括号 内的类型名 操作数的存储大小由操作数的类型决定 二 使用方法 1 用于数据类型 sizeof使用形式 size