详细解析C语言中的sizeof

详细解析C语言中的sizeof,第1张

详细解析C语言中的sizeof,第2张

Sizeof是C语言的单目运算符,比如C语言的其他运算符++、-等等。这不是一个函数。zeof运算符以字节为单位给出其操作数的存储大小。操作数可以是用括号括起来的表达式或类型名。操作数的存储大小由操作数的类型决定。二。sizeof
1的用法。sizeof用于数据类型
: sizeof(type)
数据类型必须用括号括起来。比如sizeof(int)。
2。用于变量
sizeof用法:sizeof(var_name)或sizeof var_name
变量名可以不用括号括起来。如sizeof (var_name)、sizeof var_name等。都是正确的形式。圆括号比较常见,大多数程序员都采用这种形式。
注意:sizeof运算符不能用于函数类型、不完整类型或位字段。不完全类型是指存储大小未知的数据类型,如存储大小未知的数组类型、内容未知的结构或并集类型、void类型等。
如果sizeof(max)定义为int max(),sizeof(char_v)如果char_v定义为char char_v [max]且max未知,则sizeof(void)不是正确的形式。
三。sizeof的结果
sizeof运算符的结果类型为size_t,其在头文件中的typedef为无符号int类型。此类型保证能够容纳由实现创建的对象的字节大小。
1。如果操作数的类型为char、unsigned char或signed char,则结果等于1。
ansi c官方规定字符类型为1字节。
ansi c中没有指定2、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类型的变量。
五、sizeof的主要用途
1。sizeof运算符的主要用途之一是与存储分配和i/o系统等例程进行通信。例如:
void * malloc (size _ t size),
size _ t fread (void * ptr,size _ t size,size _ t nmeb,file * stream)。
2。sizeof的另一个主要用于计算数组中元素的个数。示例:
void * memset (void * s,int c,sizeof (s))。六。建议
由于操作数的字节数在实现过程中可能会发生变化,所以在涉及操作数段大小时,建议使用sizeof而不是常量计算。
本文主要包括两部分。第一部分重点介绍了在vc中如何使用sizeof计算sizeof结构,以及容易出现的问题,并给出了解决方法。第二部分总结了sizeof在vc中的主要用途。
1。sizeof在结构中的应用
请看下面的结构:
struct my struct
{
double DDA 1;
char DDA;
int type
};
对结构mystruct使用sizeof的结果是什么?sizeof(mystruct)是什么?也许你会这样问:
sizeof(mystruct)= sizeof(double)+sizeof(char)+sizeof(int)= 13
但是当你在vc中测试上述结构的大小时,你会发现sizeof(my struct)是16。你知道vc为什么会得出这样的结果吗?
其实这是vc对变量存储的特殊处理。为了提高cpu的存储速度,vc对齐了一些变量的起始地址。默认情况下,vc规定每个成员变量的起始地址相对于结构起始地址的偏移量必须是变量类型所占用字节数的倍数。下面列出了常见的校准类型(vc6.0,32位系统)。
type
alignment(变量起始地址相对于结构起始地址的偏移量)
char
offset必须是sizeof(char),也就是说,1的倍数
int
offset必须是sizeof(int),也就是说,4的倍数
float
offset必须是4的倍数
double
offset必须是8的倍数
short[/br]同时按照上面的对齐方式调整位置,会自动填充空的缺失字节vc。同时,为了保证结构的大小是结构的字节边界数的倍数(即结构中占用空的类型所占用的字节数),vc在为最后一个成员变量申请空后,会根据需要自动填充空的缺失字节。
下面的例子用来说明vc是如何存储结构的。
struct my struct
{
double DDA 1;
char DDA;
int type
};
在给上面的结构分配空时,vc首先根据成员变量的顺序和对齐方式给第一个成员dda1分配空,它的起始地址和结构的相同(只是offset 0只是sizeof(double)的倍数),占用sizeof (double) = double。接下来,为第二个成员dda分配空。此时,下一个可赋值地址到结构起始地址的偏移量为8,是sizeof(char)的倍数。因此,在偏移量8处存储dda满足对齐,成员变量占用sizeof(char)=1字节。接下来,为第三个成员类型分配空空间。此时,下一个可赋值地址到结构起始地址的偏移量为9,不是sizeof(int)=4的倍数。为了满足对齐对偏移量的约束,vc自动填充3个字节(这3个字节里面什么都没有),下一个可赋值地址到结构起始地址的偏移量为12。正好是sizeof(int)=4的倍数,所以类型以12的偏移量存储,成员变量占用sizeof(int)=4个字节;此时整个结构的所有成员变量都已经分配空,总占用空为8+1+3+4=16,这正好是结构的字节边界数(即结构中空的类型占用的字节数为sizeof(double)=8)。所以整个结构的大小是:sizeof(mystruct)=8+1+3+4=16,其中3个字节由vc自动填充,没有放任何有意义的东西。

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

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情