b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

C语言中sizeof的用法

电脑杂谈  发布时间:2020-05-31 22:23:27  来源:网络整理

大小结构种群模型_结构数组 大小_sizeof计算结构体大小

定义: sizeof是神圣的sizeof,它是C / C ++中的运算符. 简而言之,其功能是返回对象或类型占用的内存字节数. MSDN上的解释是: sizeofkeyword给出字节,关联的类型(包括聚合类型). 关键字返回typeize_t. 它的返回值类型是size_t,在头文件stddef.h中定义. 该值取决于编译系统. 通常定义为typedef unsigned int size_t;世界上有许多编译器,但是作为一个规范,它们将确保char,有符号字符和无符号字符的大小为1,毕竟,char可用于编程. 最小的数据类型. 语法: sizeof具有三种语法形式,如下所示: sizeof(object sizeof(object sizeof(type_name sizeof(type sizeofobject; sizeof object; so,int oksizeof oksizeof(int oksizeof int; error))因为写3可以用写1代替,因此形式统一并减轻我们大脑的负担,第三种书写方式,算了吧!实际上,sizeof计算对象的大小也被转换为对象类型的计算方式,即sizeof值相同类型的不同对象是相同的.

在这里,对象可以进一步扩展到表达式,即sizeof可以计算表达式. 编译器根据表达式的最终结果类型确定大小,并且通常不计算表达式. 例如: sizeof(是int类型,所以它等效于sizeof(int); sizeof(3.14是double类型,2被提升为double,所以它等效于sizeof(double); sizeof也可以从一个函数调用Value,结果是该函数返回类型的大小,该函数将不会被调用,让我们看一个完整的示例: char foo()printf(“ foo()has been call. \ N”); return intmain()size_tsz sizeof(foo()foo()的返回值类型为char,因此sz sizeof(char),foo()将不称为printf(“ sizeof(foo()C99标准规定函数,表达式无法确定类型并且无法计算位域(bit-field)成员的sizeof值,即以下编写是错误的: sizeof(foo errorvoid foo2()sizeof(foo2()errorstruct unsignedint f1 unsignedint f2 unsignedint f3 sizeof (S.f1 sizeof常量sizeof的计算是在编译时进行的,因此它可以用作常量表达式,例如: char ary [sizeof(int ok最新的C99标准规定,也可以在运行时计算sizeof,因为以下程序在Dev中-可以在C ++中正确执行: int动态赋值函数[n]; C99还支持动态定义数组printf(“%d \ n”,sizeof(ary));好. 输出10,但未完全实现C99标准. 该代码在编译器中不起作用,上述代码在VC6中无法编译.

大小结构种群模型_结构数组 大小_sizeof计算结构体大小

因此,我们最好认为sizeof是在编译时执行的,这样它就不会带来错误并使程序更具可移植性. sizeof基本数据类型的基本数据类型是指简单的内置数据类型,例如short,int,long,float和double. 由于它们都是与系统有关的,因此在不同的系统下值可能会有所不同. 我们的注意,在这方面尽量不要给您的程序移植带来麻烦. 通常,在32位编译环境中,sizeof(int)的值为4. 指针变量sizeof已经学习了数据结构,应该知道指针是一个非常重要的概念,它记录了另一个对象的地址. 因为它用于存储地址,所以它当然等于计算机内部地址总线的宽度. 因此,在32位计算机上,指针变量的返回值必须为4(请注意,结果以字节为单位). 可以预期,在将来的64位系统中,指针变量的sizeof结果将为8. char * pc“ abc”; int * pi;字符串* ps;字符** ppc和pc;无效(* pf)(); //函数指针sizeof(pc结果为4sizeof(pi结果为4sizeof(ps结果为4sizeof(ppc的结果为4sizeof(pf的结果为4指针变量. )指针变量的sizeof值与指针指向的对象,正是因为所有指针变量都占用相同的内存大小,所以MFC消息处理函数使用两个参数WPARAM,LPARAM可以传输各种复杂的消息结构(使用指向结构的指针).

数组的sizeof数组的sizeof等于数组占用的内存字节数,例如: char a1 []“ abc”; int a2 [3]; sizeof(a1的结果为4,在字符末尾有一个NULL终止符)字符sizeof(a2的结果为3 * 4 = 12(取决于int). 有些朋友使用sizeof作为开头的数组元素数. 现在,您应该知道这是错误的,因此应该如何查找数组元素?数字很容易,通常以以下两种方式编写: int c1 sizeof(a1 sizeof(char总长度/单个元素的长度int c2 sizeof(a1 sizeof(a1 [0]总长度/第一个元素的长度写在这里)让我问,下面的c3和的值是什么?void foo3(char a3 [3])intc3 sizeof(a3 voidfoo4(char a4 [])int sizeof(a4也许您已经知道当您尝试回答的值时c3的答案是错误的,是的,c3!=3. 这里,函数参数a3不再是数组类型,但将其转换为一个指针,等效于char * a3. 为什么不仔细考虑它,我们调用函数foo1,当程序将分配te在堆栈上的大小为3的数组,不是吗!该数组被“传递”,调用者只需传递实际参数的地址,因此a3自然是指针类型(char *),c3的值仅为4.

结构数组 大小_大小结构种群模型_sizeof计算结构体大小

sizeof结构是初学者最常问的问题之一,因此有必要花更多时间在写作上. 让我们首先来看一个结构: struct S1字节,然后总和应该为5. 您在机器上尝试过吗?也许您是对的,但很可能您是错的! VC6中的默认设置为8. 为什么我总是受伤?请不要沮丧. 让我们考虑一下sizeof的定义-sizeof的结果等于对象或类型占用的内存字节数. 好吧,让我们看一下S1的内存分配. 情况: S1 s1定义上述变量后,添加一个断点,运行程序,观察s1所在的内存,以VC6.0为例,您发现什么,s1的地址为0x0012FF78,其数据内容如下所示: 0012FF78: 61 CC CC CC FF FF FF FF FF FF发现了CC发生了什么,中间有3个字节. 查看MSDN上的说明: 当应用structuretype变量时,sizeof返回实际大小,其中可能包括插入的填充字节对齐. 这就是传说中的字节对齐!一个重要的话题出现了.

为什么需要字节对齐. 计算机组成原理告诉我们,这有助于加快计算机的访问速度,否则将花费更多的指令周期. 因此,编译器将默认处理结构(实际上,其他地方的数据变量也是如此),将基本数据类型的宽度设置为2(短整除地址,依此类推). 两个数字的中间,您可能需要添加填充字节,因此整个结构的sizeof值已经增加. 让我们交换char和int在S1中的位置: 结构S2看看sizeof(S2)的结果是什么,如何仍然看存储器8,原始成员c后面还有3个填充字节,这就是为什么不用担心,下面总结这些规则: 字节对齐的细节与编译器的实现有关,但是通常,要满足三个条件: 每个结构成员相对于该结构的第一个地址的偏移量是成员大小的整数倍;如果有必要,编译器将在成员之间添加内部字节;结构就是结构整数倍最广泛的基本类型成员的大小. 如有必要,编译器将在最后一个成员之后添加尾随填充. 对于上述标准,有几点需要解释: 该点存在,因此我们可以只考虑成员的偏移量,这很容易想到. 想一想为什么. 结构成员相对于结构的第一个地址的偏移量可以通过宏offsetof()获得,该宏也定义在stddef.h中,如下所示: #define offsetof(s,m)(size_t)& (((s偏移量,方法为size_t pos pos等于4. 基本类型是指前面提到的字符,如char,short,int,float,double等. 'S内置数据类型,此处的“数据宽度”是指到它的sizeof大小.

sizeof计算结构体大小_大小结构种群模型_结构数组 大小

由于结构的成员可以是复合类型,例如另一个结构,因此在查找最宽的基本类型成员时,应包括复合类型成员的子成员,而不是将复合成员视为整个. 但是,在确定复合类型的构件的偏移位置时,将复合类型视为一个整体. 这里的描述有点草率,想起来也有点草草,让我们看一下示例(具体值仍然是VC6作为示例,以后将不再说明): struct S3 charc1; S1 charc2 S1的最宽简单成员的类型为int当S3考虑最宽的简单类型成员时,S1“中断”,因此S3的最宽简单类型为int,因此变量存储空间的第一个地址由S3定义的值需要除以4,整个sizeof(S3)的值也应可整除. c1的偏移量是0,而s的偏移量现在是一个整数. 作为结构变量,它还满足前三个条件,因此其大小为8,偏移量为4,在c1 3个填充字节和c2 12之间是必需的,将c2的大小计为13、13不是填充字节. 最后,sizeof(S3)的值为16. 通过上面的描述,我们可以得出一个公式: 结构的大小等于最后一个成员的偏移量加上它的大小加上末尾的填充字节数,即: sizeof(struct offsetof(最后一项sizeof(最后一项sizeof(尾随填充))在这里,朋友应该对结构的sizeof有新的了解,但不要太高兴,这会对具有没有被提及,那就是编译器的pack指令.

它用于调整结构的对齐方式. 不同编译器的名称和用法略有不同. 在VC6中,它是通过#pragma pack实现的. 您也可以直接修改/ Zp编译开关. #pragma pack的基本用法是: #pragma pack(是字节对齐数,其值为1、2、4、8、16,默认值为8,如果该值小于结构的sizeof值成员的偏移量应基于此值,也就是说,结构成员的偏移量应取两者中的最小值,公式如下: offsetof(item sizeof(item查看示例: #pragma pack(push)将当前包设置保存在堆栈上#pragma pack(2)//必须先使用struct S1 structS3 charc1; S1 charc2 #pragmapack(pop)来还原以前的包设置,然后再计算结构sizeof (S1),min(2,sizeof(i)的值)是2,因此i的偏移量是2,加上sizeof(i)等于6,可以除以2,因此整个S1的大小是6类似地,对于sizeof(S3),s的偏移量是2,c2的偏移量是8,加上sizeof(c2)等于9,无法除以2,并且添加了填充字节,因此sizeof(S3)等于10.

大小结构种群模型_结构数组 大小_sizeof计算结构体大小

现在,朋友可以轻松呼吸: )还有一点要注意,“空结构”(不包括数据成员)的大小不是0,而是1. 想象一下如何解决“空闲空间”变量并如何区分两个不同的“空结构”变量. 因此,还必须存储“空结构”变量,以便编译器可以为空间占用分配一个字节的空间. 如下: struct S5 sizeof(S5包含位域结构的sizeof前面已经说过,不能单独取位域成员的sizeof值,我们在这里讨论包含位域的sizeof结构,仅考虑其特殊性. 具体列出. C99规定int,unsigned int和bool可以用作位字段类型,但几乎所有编译器都对其进行了扩展,以允许存在其他类型. 使用位字段的主要目的是压缩存储空间. 一般规则是: 相邻位字段的类型相同,并且它们的位宽之和小于该类型的大小,接下来的字段将在前一个字段之前存储,直到无法容纳为止;类型相同,但是其位宽度的总和大于该类型的sizeof的大小,则以下字段将从新的存储单元开始,并且偏移量是其类型大小的整数倍;具体的i每个编译器的实现都不同. VC6采用未压缩模式,而Dev-C ++采用压缩模式. 整个结构的总大小是最宽的基本类型成员的大小的整数倍.

让我们看一个例子. 示例1: 结构BF1 charf1 charf2 charf3的内存布局为: _f1__ | __f2__ | _ | ____ f3 ___ | ____ | 1316位字段类型为char,第一个字节只能容纳f1和f2,因此f2被压缩为第一个字节. 在1个字节中,f3只能从下一个字节开始. 因此,sizeof(BF1)的结果为2. 示例2: 结构BF2 charf1 shortf2 charf3由于相邻位字段的类型不同sizeof计算结构体大小,因此在VC6中其sizeof为6,在Dev-C ++中为2. 示例3: 结构BF3 charf1 charf2; char f3非位字段散布在其中,不会产生压缩,在VC6和Dev-C ++中获得的大小为3. 联合的sizeof结构在内存组织中是顺序的sizeof计算结构体大小,并且联合是重叠的. 每个成员共享一部分内存,因此整个联合的sizeof是每个成员的最大sizeof. 结构的成员也可以是复合类型. 在这里,复合类型成员被视为一个整体. 因此,在以下示例中,U的sizeof值等于sizeof(s). 联合


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-229320-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 马骏
        马骏

        那些炮弹难道真是在电视上让那些鼓吹的军事家的咸蛋与茶叶蛋吗

      • 莫月鼎
        莫月鼎

        一直不动的抱那只股票可以赚钱

      热点图片
      拼命载入中...