总结了一些数据类型的size,虽然ANSI C并没有规定基本数据类型的大小,但某一种平台上某种基本数据类型的大小一般还是固定的:

数据类型: char   short       int      long      float   double    (long double)

gcc3.2.2:   1          2          4        4         4          8               12

Visual C++: 1        2          4        4         4          8                 8

(在谭浩强的《C程序设计》中提到,int类型占2个字节,里面用到的环境是TC,估计以后不会有人用那么低级的开发环境了吧)

对于数组的大小也比较简单,定义数组int a[10]后,sizeof(a)为所有数组元素大小之和,所以在Visual C++下其值为40,但是有一种特殊情况:

void function (int array[10])     {         printf("%d\n",sizeof(array));     }

int main(int argc , char *argv[])

{

int array[10];

function(array);

return 1;

}

这里的输出结果是4,因为C语言在数组作为参数的时候传递的只是地址,也就是在function这个函数用到的array只不过是个指针变量,其结果返回是4,因为:在Win32平台上地址为32位即指针变量的大小为4字节。顺便提一下关于main中那两个形式参数的意义,假定此main函数编译后为Test.exe的入口。如果在命令行模式(Windows下为cmd,Linux下的shell)运行时,如果你输入 Test 字符串1 字符串2,那么系统在调用此main函数时就会把3传给argc(调用此程序的参数个数输入了3个,程序名也算作一个参数),把 “Test”“ 字符串1”“字符串2”存入字符指针数组argv中,在main函数中就可以使用这些传入的参数了,这样的例子有很多,比如在命令行下运行copy命令时就会输入 copy sourcefile destinationdirectory。

共用体变量的所占字节数为最大数据类型成员的大小,例如 union Union { int i,char ch}; Union test; 则test 的大小为4(int类型的大小)。

枚举类型变量大小为4字节,本人猜测:编译器为了较好的处理字节对齐问题,将枚举类型变量的大小处理为4,不过至今还没有看到过相关的解释。

结构体类型变量的大小问题是一些公司招聘的时候很受青睐的题目。在谭的书中没有涉及到这个问题,严格的说这是个跟编译器字节对齐关系挺大的问题,网上可以搜到很多类似问题的讨论。为了使CPU对变量的进行快速高效的访问,变量的起始地址应该满足某些特性,即所谓的对齐。关于字节对齐有两个重要的宏,#pragma pack (n)和#pragma pack 第一个宏是强制编译器一般以n的倍数进行地址对齐(还有特殊情况以小于n的字节数进行对齐),第二个宏结束前面设置的对齐方式,恢复到编译器默认的对齐方式。试验证明在VC2005中这两个宏已经不起作用了。在Visual C++下默认的字节对齐数为8。

VC2005的环境,实验证实了编译器无视#pragma pack(经过试验验证)

结构体中的变量item在结构体中相对于首地址的偏移量应该是 X 的倍数,X 由如下式子确定:X=min(8,sizeof(item)),item为每一个元素。注意最后需要保留最大的那个X,作为末尾填充。因为整个结构的大小一定是最大的那个X的整数倍。

比如,

1.  struct Test { char c1; char c2; int i}大小为8,结构如下(0是系统填充)1 1 0 0 ,1 1 1 1.前两个1分别是c1和c2的两个BYTE,后4个1是i的4个BYTE.

2.  struct {char c1; double d;}大小为16。结果如下,

1 0 0 0 0 0 0 0 ,1 1 1 1 1 1 1 1.第一个1代表c1的一个byte,后面的1是d的存储。

3.  struct {char c1; double d; char c2;};大小为24.这里最大的X为8,所以最后要填充字节以达到8的整数倍。其结构如下

1 0 0 0 0 0 0 0 ,1 1 1 1 1 1 1 1 1, 1 0 0 0 0 0 0 0

4.      struct ABC  {int a;int b;double c;char d;};  

struct  Test  {char c; ABC a;char e;};

由之前的例子可以轻易得出,ABC的大小为24。然后在结构Test中,视ABC为整体,那么对于整个结构,最大的X为8,所以Test大小为40(Test.c占用1个字节,但由于ABC这一项得出的X为8,即Test.a得从位置8开始填充,所以对于Test.c补7个字节;Test.a本身占用24个字节;最后的Test.e占用1个字节——此时它占用第33个字节——但是为了补足X的整数倍(这个例子中X为8),故得出40个字节

5.  空结构大小为1

VC6.0的编译环境下的结论(由于没有环境,这里的结论有待验证)

结构体中的变量item在结构体中相对于首地址的偏移量应该是 X 的倍数,X 由如下式子确定:X=min(n,sizeof(item)),举个例子(设n为8,相当于默认设置):struct Test { char c1; char c2; int i}; 如果定义了变量Test t ,那么在存储 t 的 i 时 X 就应该是min(8,sizeof(int))即为4的倍数,即 i 相对于结构体首地址的偏移量必须是4的倍数,所以 t 的大小就应该为8字节(在c1和c2后填充了两个字节以满足前述条件)。对于struct { char c1; char c2}不会出现填充的的情况,每个成员相对首地址的偏移量也满足是X的倍数(此时X为1),其大小为2字节。

而对于结构struct {char c1; double d;},默认情况下这种结构体变量占用16字节(在c1后填充了7个字节以满足字节对齐)。如果强制编译器以4字节对齐,即在声明这种结构的变量前面有#pragma pack (4),此时X为4,则此种类型结构体变量占用的内存为12字节。

再看 struct {char c1; double d; char c2;}; 在默认字节对齐的方式下,输出其大小为24,呵呵,这是因为编译器还有一条规定:结构体变量的大小必须要为X(同上定义)的倍数,如果不满足,就会在最后一个成员后填充最少字节数以满足此条件。 如果定义此结构体前有#pragma pack(4),则输出大小为16。

还有一种特殊情况,就是空结构体。在Visual C++下其大小为1,即struct{}类型的变量在VC下输出其大小是1,解释就是VC为每个结构体变量分配一个字节的内存,以使该变量有个地址;而在gcc下输出其大小为0,我的理解是既然此结构体一个成员都没有,程序中就不会访问它,因此也不必分配内存,如果编译器碰到有访问此结构体成员的情况就会报错。

最后一种情况,结构体成员中有结构体成员的情况,如 struct test1 { char c1; int i ; char c2 ;};        struct test2 { int i; struct test1 t1; char c2; };此时考虑在确定上述的X时会把t1拆散成基本数据类型来处理,而考虑test2结构大小时又会把t1作为一个整体来对待,但此时所谓的整体是把test1中确定的那个最大的X拿出来来确定test2的X。故默认情况下,结构test2类型变量的大小为:20(test1中最大的X被确定为4,test2中也为4,t1占12个字节,在c2后又填充了3字节,总共20字节)。举个例子:

struct test1 {char c1;        double d;           char c2;};

struct test2 { int i;      struct test1 t1;         char c2;};

默认情况下,结构体test2的大小为40(最大的X被确定为8),强制4字节对齐时大小为24。其实这可以理解为编译器的另一条规则:结构体的首地址必须为其最大的那个X的整数倍。

转载于:https://www.cnblogs.com/aicro/archive/2009/10/10/1580166.html

C语言数据类型大小分析(基于VC2005编译器)相关推荐

  1. C语言数据类型本质分析

    C语言数据类型本质分析 数据类型概念 数据类型的本质思考 数据类型的本质 数据类型大小 数据类型别名 数据类型的封装 数据类型总结与扩展 思考1 思考2 数据类型概念 "类型"是 ...

  2. C语言高级编程:C语言数据类型大小和取值范围

    1. 64位Ubuntu测试结果 代码: #include<stdio.h>void main(void) {printf("sizeof(char) = %d\n", ...

  3. java 与C++ 数据类型大小

    Java中数据类型大小: 原始类型 对应的包装类型 默认值 存储格式 数据范围 short java.lang.Short 0 2个字节 -32,768到32767 int java.lang.Int ...

  4. 基于LLVM编译器的IDA自动结构体分析插件

    引用 这篇文章旨在介绍一款对基于LLVM的retdec开源反编译器工具进行二次开发的IDA自动结构体识别插件实现原理分析 文章目录 引用 简介 源码分析 LLVM编译器简介 Retdec源码分析 Kl ...

  5. 【C 语言】数据类型本质 ( sizeof 函数 | 数据类型大小 )

    文章目录 一.sizeof 函数 二.数据类型大小 三.代码示例 一.sizeof 函数 sizeof() 函数可以计算 数据类型 的大小 ; sizeof (类型说明符/表达式) 可以向函数中传递 ...

  6. C语言数据类型占内存大小

    C语言数据类型 使用sizeof计算各数据类型占用内存大小 #include<stdio.h> int main() {typedef struct {int a ;char b;int ...

  7. C语言数据类型所占空间大小

    C语言数据类型所占空间大小 /* * datasize.c -- print the size of common data items * This runs with any Linux kern ...

  8. R语言splines包构建基于logistic回归的自然样条分析:南非心脏病数据集、非线性:基函数展开和样条分析、你简单分析的不重要特征,可能只是线性不显著、而非线性是显著的

    R语言splines包构建基于logistic回归的自然样条分析:南非心脏病数据集.非线性:基函数展开和样条分析.你简单分析的不重要特征,可能只是线性不显著.而非线性是显著的 目录

  9. 《C语言编程魔法书:基于C11标准》——1.3 主流C语言编译器介绍

    本节书摘来自华章计算机<C语言编程魔法书:基于C11标准>一书中的第1章,第1.3节,作者: 陈轶 更多章节内容可以访问云栖社区"华章计算机"公众号查看. 1.3 主流 ...

  10. C语言数据类型及其大小计算

    一.数据类型 C语言数据类型多种多样,常见的数据类型包括: 字符型 char: 短整型 short: 整型 int: 长整型 long: 更长整型 long long: 单精度浮点型 float: 双 ...

最新文章

  1. Intel发布FPGA
  2. 常用浏览器内核驱动下载地址
  3. 【Kaggle-MNIST之路】CNN结构再改进+交叉熵损失函数(六)
  4. dyld: Library not loaded: @rpath/Alamofire.framework/Alamofire
  5. Apache commons lang3包ArrayUtils工具使用
  6. PHP 和 ASP.NET的优势和弱点
  7. 内部类访问局部变量的时候,为什么变量必须加上final修饰
  8. java压缩文件,中文问题
  9. cdcqの省选膜你赛
  10. PHP PSR4自动加载代码赏析
  11. Linux学习笔记4.4-Linux重定向
  12. Network-based Fraud Detection for Social Security Fraud
  13. 【EMC】电压暂降、短时中断和电压变化
  14. 测井曲线绘图显示算法总结——双缓冲技术
  15. shopex服务器信息,最新版ShopEx 安装和默认后台地址及修改方法
  16. xposed+justTrustme使用与分析
  17. CAD二次开发--自动加载插件
  18. 【经验分享】调试STM32F107VC单片机驱动DP83848以太网PHY芯片时遇到的问题
  19. 根据身份证号(18/15)计算年龄、出生日期、性别
  20. small rtos51学习资料收集

热门文章

  1. RNN LSTM GRU Attention transformer公式整理总结(超详细图文公式)
  2. VTK(二)---相机外参矩阵Tcw转VTK相机,构建VR虚拟相机
  3. kettle在linux定时任务_linux环境下kettle部署(JDK安装配置,kettle安装配置,资源库配置,定时执行job)...
  4. php2.3.2,自动加载 - ThinkPHP3.2完全开发手册
  5. C/C++[codeup 2046]8皇后
  6. AWS SageMaker 基于Random Cut Forest 的异常值检测 随机森林
  7. iOS 指令集架构Architectures armv6、armv7、armv7s、arm64、arm64e、x86_64、i386
  8. 计算机专业考研英语二国家线多少分,2020考研国家线:英语二的分数线是多少...
  9. java 文件上传终止_java文件上传
  10. 2021-09-02重排链表