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


    sizeof和strlen区别

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

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

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

    打印如下:

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


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

    示例:

    printf("char: %d
    ",sizeof(char));
    printf("short: %d
    ",sizeof(short)); 
    printf("int: %d
    ",sizeof(int));
    printf("long: %d
    ",sizeof(long)); 
    printf("long long: %d
    ",sizeof(long long));
    printf("float: %d
    ",sizeof(float)); 
    printf("double: %d
    ",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
    ",sizeof(TestA));
      printf("%d
    ",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
    ",sizeof(TestA));
      printf("%d
    ",sizeof(TestB));
    }

    打印如下:

  • 相关阅读:
    JAVA005-基本数据类型变量的存储
    JAVA003-变量、数据类型
    Python_pandas数据处理_学习
    python_性能FPS
    DB_004_创建表
    DB_003_关系数据库标准语言(SQL)
    DB_002_数据库的创建和管理
    DB_001_概念模型设计
    虚幻蓝图学习笔记 简单VR功能实现
    虚幻蓝图学习笔记 制作第一人称(实现功能:捡枪,换枪,扔枪,仍炸弹等)(一)
  • 原文地址:https://www.cnblogs.com/lifexy/p/10386552.html
Copyright © 2020-2023  润新知