全国等级考试二级详细解析C语言中的sizeof

全国等级考试二级详细解析C语言中的sizeof,第1张

全国等级考试二级详细解析C语言中的sizeof,第2张

Sizeof是C语言的单目运算符,比如C语言的其他运算符++、-等等。这不是一个函数。zeof运算符以字节为单位给出其操作数的存储大小。操作数可以是用括号括起来的表达式或类型名。操作数的存储大小由操作数的类型决定。
二。sizeof的用法

1.用于数据类型

zeof的用法:sizeof(type)

类型必须用括号括起来。比如sizeof(int)。

2.用于变量

使用sizeof的形式:sizeof(var_name)或sizeof var_name

变量名可以不用括号括起来。如sizeof (var_name)、sizeof var_name等。都是正确的形式。圆括号比较常见,大多数程序员都采用这种形式。

注意:sizeof运算符不能用于函数类型、不完整类型或位字段。不完全类型是指存储大小未知的数据类型,如存储大小未知的数组类型、内容未知的结构或并集类型、void类型等。

例如sizeof(max)如果变量MAX定义为int max(),sizeof(char_v)如果char_v定义为char char_v [MAX]且MAX未知,则sizeof(void)不是正确形式。

三。sizeof的结果

zeof运算符的结果类型是size_t,其typedef在头文件中是无符号int。此类型保证能够容纳由实现创建的对象的字节大小。

1.如果操作数的类型为char、unsigned char或signed char,则结果等于1。

C ANSI官方规定字符类型为1字节。

2.ANSI C中没有针对int、unsigned int、short int、unsigned short、long int、unsigned long、float、double和long double类型的sizeof的具体规定。大小取决于实现,一般可以分别为2、2、2、4、4、8、10。

3.当操作数是指针时,sizeof取决于编译器。比如在微软C/C++7.0中,near类的指针字节数是2,far和huge类的指针字节数是4。通常,Unix中的指针字节数是4。

4.当操作数具有数组类型时,结果是数组的总字节数。

5.联合类型操作数的sizeof是其字节成员的字节数。Sizeof of a structure operand是此类对象的总字节数,包括任何填充。

让我们看看下面的结构:

struct { char b;双x;} a;

在某些机器上,sizeof(a)=12,但通常sizeof(char)+ sizeof(double)=9。

这是因为编译器在考虑对齐问题时,在结构中插入空位来控制每个成员对象的地址对齐。比如double类型的结构成员X要放在能被4整除的地址。

6.如果操作数是函数中的数组参数或函数类型的参数,sizeof会给出其指针的大小。

第四,sizeof与其他算子的关系

sizeof的优先级为2级,高于/和%等3级运算符。它可以与其他运算符组合形成表达式。I * sizeof(int);其中I是int类型的变量。

动词 (verb的缩写)sizeof的主要用途

1.sizeof运算符的主要用途之一是与存储分配和I/O系统等例程进行通信。例如:

void *malloc(size_t size),

size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream).

2.另一个sizeof的主要用途是计算数组中元素的数量。例如:

void * memset(void * s,int c,sizeof(s))。

不及物动词建议

由于操作数的字节数在实现过程中可能会发生变化,因此当涉及到操作数部分大小时,建议使用sizeof而不是常量计算。

本文主要包括两个部分。第一部分重点介绍了如何在VC中使用sizeof查找结构的尺寸,以及容易出现的问题,并给出了解决方法。第二部分总结了Sizeof在VC中的主要用途。

1.尺度在结构中的应用

请看下面的结构:

struct my struct
{
double DDA 1;
char DDA;
int type
};

将sizeof用于结构MyStruct时会发生什么?sizeof(MyStruct)是什么?也许你会这样问:

sizeof(my struct)= sizeof(double)+sizeof(char)+sizeof(int)= 13

但是在VC中测试上述结构的大小时,你会发现sizeof(MyStruct)是16。你知道VC为什么会得出这样的结果吗?

其实这是VC对变量存储的特殊处理。为了提高CPU的存储速度,VC对齐了一些变量的起始地址。默认情况下,VC规定每个成员变量的起始地址相对于结构起始地址的偏移量必须是变量类型所占用字节数的倍数。下面列出了常见的校准类型(vc6.0,32位系统)。

Type
alignment(变量起始地址相对于结构起始地址的偏移量)

Char
偏移量必须是sizeof(char),即1的倍数

Int
offset必须是sizeof(int),它是4的倍数。

float
偏移量必须是sizeof(float),它是4的倍数。

Double
offset必须是sizeof(double),它是8的倍数
Short
offset必须是sizeof(short),它是2的倍数。

成员变量存储时,按照它们在结构中出现的顺序依次应用空。同时按照上面的对齐方式调整位置,会自动填充空的缺失字节VC。同时,为了保证结构的大小是结构的字节边界数的倍数(即结构中占用空的类型所占用的字节数),VC在为最后一个成员变量申请空后,会根据需要自动填充空的缺失字节。

下面的例子用来说明VC是如何存储结构的。

struct my struct
{
double DDA 1;
char DDA;
int type
};

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 全国等级考试二级详细解析C语言中的sizeof

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情