专栏首页Linux驱动C-sizeof和strlen区别,以及sizeof如何计算结构体大小

C-sizeof和strlen区别,以及sizeof如何计算结构体大小

sizeof和strlen区别

  • sizeof是关键字,在编译时就能计算出值,可以计算任何类型
  • strlen是函数,只有在运行时才能去计算,且只能计算字符型的.

对于数组时,strlen是判断’\0’为标志结尾的,而sizeof则计算的是数组整个空间 示例如下:

char buf1[]="abcde";
char buf2[30]="ABC";
printf("buf1: %d %d\n",sizeof(buf1),strlen(buf1));
printf("buf2: %d %d\n",sizeof(buf2),strlen(buf2));

打印如下:

可以看到当我们的buf1没有指定长度时,sizeof打印的是6,这是因为它把’\0’也包含进去了.

sizeof还可以计算类型大小,一般对于32位C程序而言,对应的long则为4字节 如下图所示:

示例:

printf("char: %d\n",sizeof(char));
printf("short: %d\n",sizeof(short)); 
printf("int: %d\n",sizeof(int));
printf("long: %d\n",sizeof(long)); 
printf("long long: %d\n",sizeof(long long));
printf("float: %d\n",sizeof(float)); 
printf("double: %d\n",sizeof(double));

打印如下:

sizeof计算结构体大小 计算机为了加快取读结构体的内容速度,所以会对结构体进行字节对齐. 字节对齐的规律就是:结构体大小必须是最大成员的倍数(方便寻址) 示例1:

struct TestA{
  short a;
  long b;    //b=4, a=1,而5%4=1,所以会在a上面补齐3字节,所以s1=8
};
struct TestB{
  char c;
  TestA d;    
  int f;    //c=1,d=8,f=4,而1+8+4=13,13%8=5,还差3字节,所以会在c上面补齐3字节, s2=16
};
int main()
{
  printf("%d\n",sizeof(TestA));
  printf("%d\n",sizeof(TestB));
}

打印如下:

示例2:

struct TestA {
  short a;
  long b;    //s1=8,之前已经分析过
};
struct TestB{
  char c;
  TestA d;    
  long long f;    //c=1,s1=8,f=8,由于8最大,且17%8=1,所以会在c上面补齐7字节,则s2=24
};
int main()
{
  printf("%d\n",sizeof(TestA));
  printf("%d\n",sizeof(TestB));
}

打印如下:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 33.QT-UTF8,GBK互转

    张诺谦
  • 协处理器CP15介绍—MCR/MRC指令(6)

    概述:在基于ARM的嵌入式应用系统中,存储系统的操作通常是由协处理器CP15完成的。CP15包含16个32位的寄存器,其编号为0~15。 而访问CP15寄存器的...

    张诺谦
  • linux内核里的字符串转换 ,链表操作常用函数(转)

    文章来源http://blog.sina.com.cn/s/blog_b2aa4e080102xw25.html

    张诺谦
  • 推荐五篇论文| 轻量级的Transformer; 对比学习;ResNeSt;Shortcut Learning等

    Transform已经在自然语言处理(例如机器翻译,问题解答)中无处不在;但是,要实现高性能,它需要大量的计算,这使其不适合受硬件资源和电池严格限制的移动应用程...

    黄博的机器学习圈子
  • CSS Selectors Level 4新特性全面解析

    前言 当看到 CSS Selectors Level 4 很多人会理所当然地喊出 CSS4。但是,这里必须明确一个概念,目前所谓的 CSS3 和 CSS4 都是...

    Java帮帮
  • Scala Iterator(迭代器)

    Scala Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法。 迭代器 it 的两个基本操作是 next 和 hasNext。 调用 ...

    大数据工程师-公子
  • Windows Phone 8.1 新特性 - 控件之列表选择控件

    本篇我们来介绍Windows Phone 8.1 新特性中的列表选择控件。 在Windows Phone 8 时代,大家都会使用 LongListSelecto...

    Shao Meng
  • jdk配置

    变量值:(变量值填写你的jdk的安装目录,例如本人是 E:\Java\jdk1.7.0)

    似水的流年
  • jdk配置

    1.右键选择 计算机→属性→高级系统设置→高级→环境变量

    似水的流年
  • 动态 | 序列转换模型三合一!谷歌提出首个端到端的直接语音翻译模型

    AI 科技评论按:不同语言之间的语音到语音转换早已不是什么新鲜事了,任务拆分简单直接,只需要把「源语言的语音识别模型(语音转文本)」、「文本到文本翻译模型」、「...

    AI科技评论

扫码关注云+社区

领取腾讯云代金券