目录

sizeof关键字

主要功能

常见用法

与基本数据类型的相关的内存空间大小的求解

与数组相关的内存空间大小的求解

在数组的定义处

在具体函数的中

运行实例

与指针的相关的变量所占内存空间大小的求解

运行实例

与结构体相关的变量所占内存空间大小的求解

运行实例

与枚举相关的变量所占内存空间大小的求解

运行实例

与联合体(union)相关的变量所占内存空间大小的求解

运行实例


  • sizeof关键字

sizeof  为C语言的一个主要关键字,而并非是一个函数,虽然其后经常会跟着一对括号,这就导致许多人认为这是一个函数,进而产生误解。

  • 主要功能

求某一特定的变量、指针、结构体、枚举、联合体等所占内存空间的大小。

  • 常见用法

  • 与基本数据类型的相关的内存空间大小的求解

sizeof(short) = ?
sizeof(int) = ?
sizeof(float) = ?
sizeof(double) = ?
sizeof(char) = ?

这些基本数类sizeof所求的内存空间大小受到不同系统的约束。例如:在64位系统下,其大小分别为:

sizeof(char)   = 1
sizeof(short)  = 2
sizeof(int)    = 4
sizeof(float)  = 4
sizeof(double) = 8
  • 与数组相关的内存空间大小的求解

int   arr[64] = {0};sizeof(arr) = ?
sizeof(arr[0]) = ?
sizeof(arr[64]) = ?
sizeof(&arr) = ?
sizeof(&arr[0]) = ?int  func (int arr[])
{sizeof(arr) = ?sizeof(&arr) = ?
}
  • 在数组的定义处

  1. sizeof(arr) = 256, 是求数组的实际大小,即为 64 * 4 = 256
  2. sizeof(arr[0]) = 4 ,是求数组的第一个元素所占内存空间的大小,即和其定义时候的数据类型有关,这里为int 即为4字节,若为char即为1个字节依次类推。
  3. sizeof(arr[64]) = 4,与sizeof(arr[0])类似;
  4. sizeof(&arr),则是求&arr所占内存空间的大小,即求一个指针所占内存空间的大小,会与系统是64位还是32位有关;若为64位系统,则其大小位8字节,若为32位系统,则其大小位4字节 。
  5. sizeof(&arr[0])与sizeof(&arr)类似,都是求解一个指针所占内存空间的大小;
  • 在具体函数的中

  1. sizeof(arr) = 8,因为在函数传参的时候数组实参会当指针形参来处理,即所传的只是数组的首地址,所以sizeof(arr)的大小会与系统的位数有关;
  2. 其他的sizeof的相关求解不发生变化,例如sizeof(&arr) = 8;
  • 运行实例

    ***********in arr:**********sizeof(arr)      = 256
    sizeof(&arr)     = 8
    sizeof(&arr[0])  = 8
    sizeof(arr[64])  = 4
    sizeof(arr[0])   = 4*********in function:**************sizeof(arr)      = 8
    sizeof(&arr[0])  = 8
    
  • 与指针的相关的变量所占内存空间大小的求解

int  p_int = NULL;sizeof(p_int) = ?sizeof(*p_int) = ?
  1. sizeof(p_int)  只要是指针其用sizeof来求某个指针变量所占内存空间的大小都与系统的位数有关,若为64位,则其大小永远位8字节;若为32位,则其大小永远为4字节。
  2. sizeof(*p_int) = 4,指针前加*表示取指针所指向的那段内存存放的值,即*p_int为int类型,所以其大小为4字节;
  • 运行实例

    sizeof(p_int)  = 8
    sizeof(*p_int) = 4
  • 与结构体相关的变量所占内存空间大小的求解

typedef struct student
{char          name[64];int           age;unsigned int  id;char          sex;}student_t;  typedef struct zero
{char          name[64];int           age;unsigned int  id;char          sex;}zero_t;  void test()
{student_t st_student;printf("sizeof(st_student)   = %ld\n", sizeof(st_student));zero_t st_aero;printf("sizeof(st_zero)   = %ld\n", sizeof(st_zero));}
  1. sizeof(st_student)的大小为多少呢? 是73?还是76?答案显然不是73。因为结果体会有字节对齐。正确答案为76
  2. 结构体对齐的概念:即以结构体成员中占内存最多的数据类型所占的字节数为标准,所有的成员在分配内存时都要与这个长度对齐。我们以上面这个程序为例,结构体变量 student 的成员中占内存最多的数据类型是 int 型,其占 4 字节的内存空间,那么所有成员在分配内存时都要与 4 字节的长度对齐。也就是说,虽然 char 只占 1 字节,但是为了与 4 字节的长度对齐,它后面的 3 字节都会空着。所以其大小都会4的整数倍。
  3. 如果我们定义一个空的结构体。那么其大小会是多少呢? 0? 1? 还是其他?我们会理所当然认为他的值应该是0,但是很可惜他不是0,而是1。但是我在Ubuntu的gcc的编译器下测试结果为0,在vc下测试结果为1,也许他还会和编译的实现相关吧。还有些编译器如果你定义一个空的结构体他会不干,抛错。
  4. #pragma pack(x)我们也可以是#pragma pack(x)来改变结构体对齐的字节。例如:
    #pragma pack (1)typedef struct student
    {                                                char          name[64];                      int           age;                           unsigned int  id;                            char          sex;                           }student_t;     void test()
    {student_t st_student;printf("sizeof(st_student)   = %ld\n", sizeof(st_student));
    }
  5. 其输出值为 : 
    sizeof(st_student)   = 73
  • 运行实例

sizeof(st_student)   = 76sizeof(st_zero)      = 0
  • 与枚举相关的变量所占内存空间大小的求解

enum color
{                                              RED,                                       BLUE,                                      YELLOW
}en_color;                                     void test()
{                                              printf("sizeof(en_color)   = %ld\n", sizeof(en_color));
}  
  1. sizeof(en_color)  ==> sizeof(int),永远为4,不管其内部有多少变量。枚举类型,指一个被命名的整型常数的集合。即枚举类型,本质上是一组常数的集合体,只是这些常数有各自的命名。枚举类型,是一种用户自定义数据类型。枚举变量,由枚举类型定义的变量。枚举变量的大小,即枚举类型所占内存的大小。由于枚举变量的赋值,一次只能存放枚举结构中的某个常数。所以枚举变量的大小,实质是常数所占内存空间的大小(常数为int类型,当前主流的编译器中一般是32位机器和64位机器中int型都是4个字节),枚举类型所占内存大小也是这样。
  • 运行实例

    sizeof(en_color)   = 4
  • 与联合体(union)相关的变量所占内存空间大小的求解

    union
    {int  age;char name[64];char sex;}un_student;void test()
    {    printf("sizeof(un_student)   = %ld\n", sizeof(un_student));
    } 
  1. sizeof(un_student) = 64,因为联合体的大小为其中定义的最大变量的大小。
  • 运行实例

    sizeof(un_student)   = 64

C++/C语言sizeof关键字详解相关推荐

  1. C语言const关键字详解

    C语言的const关键字 const 在实际编程中用得并不多,const 是 constant 的缩写,意思是"恒定不变的"!它是定义只读变量的关键字,或者说 const 是定义常 ...

  2. C语言的关键字 详解

    一.C语言的关键字 C语言中的32个关键字及其意思如下: 由 ANSI 标准定义的C 语言关键字共32 个.根据关键字的作用,可以将关键字分为数据类型关键字和流程控制关键字两大类. 1.数据类型关键字 ...

  3. C语言保留字(关键字)详解

    保留字(reserved word) 保留字又称关键字. 指在高级语言中已经定义过的字,使用者不能再将这些字作为变量名或过程名使用. 每种程序设计语言都规定了自己的一套保留字. 例如:BASIC语言规 ...

  4. 【老九学堂】【初识C语言】C语言保留字(关键字)详解

    保留字(reserved word) 保留字又称关键字. 指在高级语言中已经定义过的字,使用者不能再将这些字作为变量名或过程名使用. 每种程序设计语言都规定了自己的一套保留字. 例如:BASIC语言规 ...

  5. C语言volatile关键字详解

    volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据.如果没有volatile关键字,则编译器可能优化读取和存储 ...

  6. MySQL查询语种关键字_SQL——SQL语言全部关键字详解

    http://blog.csdn.net/quinnnorris/article/details/71056445 数据库中我们做常用的就是SQL基本查询语言,甚至有些人认为数据库就是SQL,SQL就 ...

  7. c语言extern关键字详解

    在c语言中代码的执行顺序是从上往下执行的,如果定义的函数或者变量在调用之后,那么调用的时候编译就会找不到需要使用的变量.这样就会出现错误,如下代码: #include<stdio.h>in ...

  8. c语言所有关键字作用,void_C语言void关键字详解

    void类型修饰符(type specifier)表示"没有值可以获得".因此,不可以采用这个类型声明变量或常量.void 类型可以用于下面各小节所描述的目的. void用于函数声 ...

  9. C语言struct关键字详解—结构体

    struct 是个神奇的关键字,它将一些相关联的数据打包成一个整体,方便使用. 在网络协议.通信控制.嵌入式系统.驱动开发等地方,我们经常要传送的不是简单的字节流(char 型数组),而是多种数据组合 ...

最新文章

  1. python中栈_Python中的栈
  2. 奇异值分解(SVD)原理详解及推导 (转)
  3. 正则提取字符串-python
  4. Java知识系统回顾整理01基础04操作符05赋值操作符
  5. ECCV 2020 论文大盘点-视频理解与分类篇
  6. 解决wordpress后台管理访问速度慢的问题
  7. 做某一项目常见知识点链接
  8. java实现自动定位,java swing 如何自动定位尾部
  9. linux 播放wav文件,Java音频无法在Linux中播放wav文件
  10. 威廉玛丽学院计算机专业好吗,威廉玛丽学院计算机硕士语言要求请问在哪
  11. 尺寸工程分析软件-尺寸公差分析软件-尺寸链计算软件
  12. iS3 岩石隧道数据准备手册
  13. 数字型谜题或算法小节
  14. 设置IE浏览器的版本方式
  15. MCS-51单片机C语言程序注释,精通MCS-51单片机C语言编程
  16. 使用飞信API 发送 短信
  17. 2022-2028年中国桌面云产业发展动态及市场需求预测报告
  18. 银行提供了整存整取定期储蓄业务,存期分为1年,2年,3年,5年,到期取本息之和,年利率如下 1年 2.25% 2年 2.7% 3年 3.24% 5年
  19. 月活增长达阿里10倍,拼多多凭什么?
  20. 如何快速创建IC类封装及封装下载网址

热门文章

  1. gog无效的验证码_如何退款GOG游戏
  2. 三菱mr系列服务器故障代码a6,三菱MR-JE-40A操作手册MR-JE-40A故障排除篇手册 - 广州凌控...
  3. 【pytest】2.pytest的前置、后置
  4. 使用opencv制作人脸识别小软件
  5. 两台pc如何高速度传输大文件
  6. 【柒志科技】面经 base上海
  7. BENNING46393电源维修SMPS-MC2贝朗北宁电源维修
  8. 泰拉瑞亚mod鸿蒙方舟,三款高评分的沙盒生存类手游,经典之作泰拉瑞亚你有玩过吗?...
  9. 【C++】类和对象---什么是类?
  10. 从新手到老鸟的脱变过程之《如何做手游项目》