C基础题-sizeof

sizeof  C语言中判断数据类型或者表达式长度符;关键字;字节数的计算在程序编译时进行,而不是在程序执行的过程中才计算出来!

一、关于sizeof简单的总结
  1、sizeof的使用形式:sizeof(var_name)或者sizeof var_name
  2、变量名可以不用括号括住:sizeof a
  3、数据类型必须用括号括起来:sizeof(int)
  4、sizeof可以对表达式求值:sizeof(2+3.14),实际是sizeof(double)
  5、sizeof可以对函数调用求值,实际上是对返回值类型求值
  6、以下情况不能用sizeof进行求值
      1)不能对函数名求值
      2)不能对不确定返回值的类型求值,如void
     3)位域成员不可以使用sizeof求值
  7、sizeof的结果是size_t,它被定义为unsigned int类型。该类型保证容纳显示所建立的最大对象的字节大小。
     C++标准规定,int占一个机器字长。
    32位机器:
    短整形      short int = 16 位 = 2 字节
    整形          int = 32 位 = 4 字节
    长整形            long int = 32 位 = 4 字节
    单精度     float = 32 位 = 4 字节
    双精度       double = 64 位 = 8 字节
    长整形双精度  long double = 64 位 = 8 字节
    字符型            char = 8 位 = 1 字节
    无符号字符型       unsigned char = 8 位 = 1 字节
    有符号字符型      signed char = 8 位 = 1 字节
    无符号整形    unsigned int = 32 位 = 4 字节
    有符号整形    signed int = 32 位 = 4 字节
    无符号长整形      signed long int = 32 位 = 4 字节

    指针p      sizeof(p) 32位=4字节
  8、sizeof与strlen()比较,在计算字符数组时,sizeof包含'\0',strlen()不包含'\0'
  9、32位系统下指针的sizeof是4字节,64位下是8字节
  10、对引用的sizeof,其实是对其所绑定的对象的sizeof
  11、对于C字符串,需要牢记C/C++中一个汉字占两个字节(Linux下3个字节),且字符串尾有空字符。
  12、对数组sizeof可以计算数组的大小
  13、数组作为形参时,数组名的sizeof是4个字节
  14、32bit系统中,int **a[3][4];sizeof(a)=48

注:

int型字长问题:
① C/C++规定int字长和机器字长相同;
② 操作系统字长和机器字长未必一致;
③ 编译器根据操作系统字长来定义int字长;
由上面三点可知,在一些没有操作系统的嵌入式计算机系统上,int的长度与处理器字长一致;有操作系统时,操作系统的字长与处理器的字长不一定一致,此时编译器根据操作系统的字长来定义int字长:"在64位机器上运行win32系统,那么所有for win32的C/C++编译器中int都是32位的"。

二、关于struct的空间计算

  struct的空间计算比较复杂,总体遵循两个规则:
   1)在windows32环境下,整体空间是占用空间最大的成员(的类型)所占字节的整数倍,在Linux+gcc环境下,若最大成员类型所占字节数超过4,如double是8,则整体空间是4的整数倍即可。
  2)在windows32环境下,数据对其原则——内存结构体成员的先后顺序排列,当排到该成员变量时,其前面已经摆放的空间大小必须是该成员类型大小的整数倍,如果不够则补齐,以此类推。但在Linux+gcc环境下,若成员类型超过4,如double是8,则前面已经摆放的空间大小是4的整数倍即可,不够则补全。
  win32环境下:在摆放时,思路是:
    1、首先把第一个成员放在地址为0的地方
    2、然后再根据第二个成员的类型大小寻找其摆放的起始位置,摆放起始位置必须是类型大小的整数倍,依次类推。
    3、最后,再计算整体空间是不是最大类型大小的整数倍。
  而在Linux+gcc环境下:摆放的思路是
    1、首先把第一个成员放在地址为0的地方
    2、如果一个单元装不下,则另放在一个单元地址的起始位置。
    3、最后,如果最大类型带下超过4,再计算整体空间是不是4的整数倍。

四、关于union的空间计算
  联合体的sizeof值是所有成员sizeof的最大值。

五、关于枚举的空间计算
  enum只是定义了一个常量集合,里面没有“元素”,而枚举是当做int类型存储的,故枚举类型的sizeof值为4。

上一篇:RegisterUserFunc为测试对象添加新方法或重写已有方法


下一篇:css样式之background详解(格子效果)