首页 > 编程知识 正文

c语言gets函数用法,c语言的sizeof怎么用

时间:2023-05-03 05:38:04 阅读:118235 作者:4263

定义: sizeof是神圣的sizeof,是C/C的运算符。 简单地说,是返回对象或类型所消耗的存储器字节数的功能。 在MSDN中的解释由: sizeofkeyword给出字节,相关类型(包括集成类型)。 关键字返回typeize_t。 其返回类型在头文件stddef.h中定义。 此值取决于编译系统。 通常为typedef unsigned int size_t; 世界上有许多编译器,但规范确保char、有符号字符和无符号字符的大小为1。 毕竟,char可以用于编程。 最小的数据类型。 语法: sizeof包括: sizeof (对象大小) (对象大小) ) : sizeof对象; so,intoksizeofoksizeof () intoksizeofint; error ) ) ),可以将写3替换为写1,从而统一形状,减轻我们的大脑负担。 第三个留言已经够了吧。 实际上,sizeof计算对象的大小也会转换为对象类型的计算方法。 也就是说,sizeof值相同类型的不同对象是相同的。

其中,对象可以进一步扩展为表达式。 也就是说,sizeof可以计算表达式。 编译器根据表达式的最终结果类型确定大小,通常不计算表达式。 例如, sizeof (是int型,因此等效于sizeof ) int; sizeof(3.14为双精度型,2为双精度,因此与sizeof (双精度)相当。 sizeof还可以从函数中调用Value。 因此,函数返回类型的大小,而不调用函数。 完整的示例: char foo () printf (“foo”) has been call. N )。 返回主(size _ tsz sizeof (foo ) foo ) )的返回类型为char,因此szsizeof (char )、foo ()为printf (“sizeof (foo ) ) ) 不称为。表达式无法确定类型,无法计算位字段成员的sizeof值。 也就是说,以下描述是错误的:sizeof(fooerrorvoidfoo2)、sizeof (foo2) )、errorstructunsignedintf 1未指定的int F2未指定的int F3 sizeof 例如,3360 charary [ sizeof (根据intok最新的C99标准规定,也可以在运行时计算sizeof。 这是因为以下程序为Dev、-c、 int动态赋值函数[n]; C99还支持动态定义数组printf(「%dn”,sizeof ) Ary )。 是的,输出. 10,但没有完全实现C99标准。 此代码在编译器中不起作用,上述代码不能在VC6中编译。

因此,最好认为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结果为sizeof,pi结果为sizeof,PS结果为sizeof,PPC结果为4sizeof,pf结果为4指针变量.)指针变量的sizeof值和指针指向的对象为

数组的sizeof数组的sizeof等于数组占用的内存字节数。 例如, char a1 []“ abc”; int a2 [3]; sizeof(a1的结果为4,字符末尾有空结尾)字符sizeof(a1的结果为3 *4=12 (根据int )。 一些朋友使用sizeof作为开头的数组元素数。 这是错误的,所以你应该知道应该怎么找数组元素吧。 数字很简单。 通常,intc1sizeof(a1sizeof ) char全长/单个元素的长度int C2 sizeof (a1 sizeof ) a1[0]全长/第一个元素的长度写在此处) )以下c3的值是什么? voidfoo3(chara3[3] ) int C3 sizeof (a3 void foo4) chara

4 [])int sizeof(a4也许您已经知道当您尝试回答的值时c3的答案是错误的,是的,c3!=3. 这里,函数参数a3不再是数组类型,但将其转换为一个指针,等效于char * a3. 为什么不仔细考虑它,我们调用函数foo1,当程序将分配te在堆栈上的大小为3的数组,不是吗!该数组被“传递”,调用者只需传递实际参数的地址,因此a3自然是指针类型(char *),c3的值仅为4.

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大小.

由于结构的成员可以是复合类型,例如另一个结构,因此在查找最宽的基本类型成员时,应包括复合类型成员的子成员,而不是将复合成员视为整个. 但是,在确定复合类型的构件的偏移位置时,将复合类型视为一个整体. 这里的描述有点草率,想起来也有点草草,让我们看一下示例(具体值仍然是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.

现在,朋友可以轻松呼吸: )还有一点要注意,“空结构”(不包括数据成员)的大小不是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是每个成员的最wqdwt. 结构的成员也可以是复合类型. 在这里,复合类型成员被视为一个整体. 因此,在以下示例中,U的sizeof值等于sizeof(s). 联合

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-lmdbbt.com/a/jisuanjixue/article-229320-1.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。