分类: C/C++
2009-07-28 21:34:17
再谈sizeof
一、 数组
Int a;
char s1[] = "EACF"
a = sizeof(s1);
输出a = 5 char占一个字节
以上是在ICC上实验的。
如果在VC6.0下实验结果一样。
Int a;
char s1[4] = "EACF"
a = sizeof(s1);
输出a = 4 char占一个字节
以上是在ICC上实验的。
如果在VC6.0下,提示错误,array bounds overflow,意思是数组边界溢出了!
如果char s1[x] = "EACF",x>4的话,sizeof(s1) = x。
二、 指针
在32位计算机中,一个指针变量的返回值必定是4(注意结果是以字节为单位),下面的实验是在8位机下的,一个指针变量的返回值是2。
unsigned char *p4 = "323456";
unsigned char** ppc = &p4;
unsigned char *p1;
unsigned int *p2;
void (*pf)(void);
a = sizeof(p4);
a = sizeof(ppc);2
在VC6.0下都为4
三、结构体
struct S1
{
char c;
int i;
};
在VC6.0下实验为8,因为要字节对齐!
struct
{
unsigned char bytes[8];
int *s;
void (*p) (); //函数指针
}OrderTable;
在VC6.0下实验为8+4+4=16
struct
{
unsigned char bytes[9];
void (*p) (); //函数指针
}OrderTable;
在VC6.0下实验为9+4=13,考虑到结果应该能被4整数,所以
Sizeof(OrderTable)=16.
struct
{
unsigned char bytes[9];
int i;
}OrderTable;
在VC6.0下实验为9+4=13,考虑到结果应该能被4整数,所以
Sizeof(OrderTable)=16.
其中i就是最宽基本类型
字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。