-
C
语言中的
sizeof
的理解。。
一、
sizeof
p>
的概念
p>
sizeof
是
C
语言的一种单目操作符,如
C
语言的其他操作符
++
、
--
等。它并不是函数
。
sizeof
操作符以
字节
形式给出了其操作数的存储大小。操作数可以是一个表达式或
括在括号<
/p>
内的类型名
。操作数的存储大小由操作数的类型决定。
二、
sizeof
的使用方法
1
、用于数据类型
sizeof
使用形式:
sizeof
(
type
)
数据类型必须用括号括住。如
siz
eof
(
int
)
。
2
、用于变量
sizeof
使用形式:
sizeof
(
var_name
)或
sizeof
var_name
变量名
可以不用括号括住。如
sizeof
(var_name)
,
sizeof
var_name
等都是正确形式。
带
括号的用法更普遍,大多数程序员采用这种形式。
注意:
sizeof
操作符不能用于函数类型,不完全类型或位字段。
不完全类型指具有未知
存储大小的数据类型,
< br>如未知存储大小的数组类型、
未知内容的结构或联合类型、
void
类型
等。
p>
如
sizeof(max)
若此时变量
p>
max
定义为
int
max(),sizeof(char_v)
若此时
char_v
定义为
char
char_v
[MAX]
且
MAX
未
知,
sizeof(void)
都不是正确形式。
三、
sizeof
的结果
sizeof
操作符的
结果类型是
size_t
,
它在头文件中
typedef
为
uns
igned
int
类型。
该类型
保证能容纳实现所建立的最大对象的字节大小。
1
、若操作数具有类型
char
、
unsigned
char
或
signed
char
,其结果等于
1
。
ANSI
C
正式规定字符类型为
1
字节。
2
、
int
、
unsigned
int
、
short
int
、
unsigned
short
、
long
int
、
unsigned
long
、
float
、
double
、
long
double
类型的
sizeof
在
ANSI
C
中没有具体规定,
大小依赖于实现,
一般可能分别为
2
、
2
、
2
、
2
、
4
、
4
、
4
、
8
、<
/p>
10
。
3
p>
、当操作数是指针时,
sizeof
依赖于
编译器。例如
Microsoft
C
/C++7.0
中,
near
类指
p>
针字节数为
2
,
f
ar
、
huge
类指针字节数为
4
。一般
Unix
的
指针字节数为
4
。
p>
4
、当操作数具有数组类型时,其结果是数组的总字节数。
5
、共用体类型操作数的
sizeof
是其最大字节成员的字节数。结构类型操作数的
sizeof
是这种类型对象的总字节数。
让我们看如下结构:
struct
{char
b;
double
x;}
a;
p>
在某些机器上
sizeof
(
a
)
=12
,而一般
sizeof
(
char
)
+
sizeof
(
double
)
=9
p>
。
这是因为编译器在考虑对齐问题时
,在结构中插入空位以控制各成员对象的地址对齐。
如
doub
le
类型的结构成员
x
要放在被
4
整除的地址。
6
p>
、如果操作数是函数中的数组形参或函数类型的形参,
sizeof
给出其指针的大小。
四、
sizeof
< br>与其他操作符的关系
p>
sizeof
的优先级为
2
级,比
/
、
%
等
3
级运算符优先级高。它可以与其他操作符一起组成
表达式。如
i*sizeof
(
int
)
;其中
i<
/p>
为
int
类型变量。
五、
sizeof
的主要用途
1
、
siz
eof
操作符的一个主要用途是与存储分配和
I/O
系统那样的例程进行通信。例如:
void
*malloc
(
size_t
size
)
,
size_t
fread(void
*
ptr,
size_t
size,
size_t
nmemb,
FILE
*
stream)
。
p>
2
、
sizeof
的另一个的主要用途是计算数组中元素的个数。例如:
void
*
memset
(
void
*
s,
int
c,
sizeof(s)
)
。
六、建议
由于操作数的字节数在实现时可能
出现变化,建议在涉及到操作数字节大小时用
sizeof
来代
替常量计算。
< br>本文主要包括二个部分,第一部分重点介绍在
VC
中,<
/p>
怎么样采用
sizeof
来求结构体的<
/p>
大小,以及容易出现的问题,并给出解决问题的方法,第二部分总结出
VC
中
sizeof
的主要
用法。
1
、
sizeof
应用在结构体上的情况
请看下面的结构:
struct
MyStruct
{
double dda1;
char dda;
int type
};
对结构
MyStruct
采用
sizeof<
/p>
会出现什么结果呢?
sizeof(MyStruct)
为多少呢?也许你会这
样求:
sizeof(MyStruct)=sizeof(dou
ble)+sizeof(char)+sizeof(int)=13
但是当在
VC
中测试上面结构的大小时,你会发现
sizeof(MyS
truct)
为
16
。你知道为什
p>
么在
VC
中会得出这样一个结果吗?
其实,
这是
VC
对变量存
储的一个特殊处理。
为了提高
CPU
的
存储速度,
VC
对一些变
量的起始地址
做了
“
对齐
”
处理。
在默认情况下,
VC
规定各成员
变量存放的起始地址相对于
结构体的起始地址的偏移量必须为该变量的类型所占用的字节
数的倍数。
下面列出常用类型
的对齐方式
(vc6.0,32
位系统
)
。
p>
类型
<
/p>
对齐方式(变量存放的起始地址相对于结构的起始地址的偏移量)
Char
偏移量必须为
sizeof(char)
即
< br>1
的倍数
int
偏移量必须为
sizeof(int)
即
4
的倍
数
float
偏移量必须为
sizeof(float)
即
4
的倍数
double
偏移量必须为
sizeof(double)
即
8
的倍数
Short
偏移量必须为
sizeof(sho
rt)
即
2
的倍数
各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,
同时按照上面的对齐<
/p>
方式调整位置,
空缺的字节
VC
会自动填充。
同时
VC
为了确保结构的大小为结构体的字节
边界数
(即该结构中占用最
大空间的类型所占用的字节数)
的倍数,
所以在为最后一个成员
变量申请空间后,还会根据需要自动填充空缺的字节。
下面用
前面的例子来说明
VC
到底怎么样来存放结构的。
struct MyStruct
{
double dda1;
char dda;
-
-
-
-
-
-
-
-
-
上一篇:软件开发工具与环境模拟题二及答案
下一篇:合同翻译一