struct struct_A{
int a;
char b;
int c;
short d;
}
struct struct_B{
int a;
char b;
short c;
int d;
}
struct_A a;
struct _B b;
问:sizeof(struct_A a) = ?
sizeof(struct_A b) = ?
答案:sizeof(a) 为16,sizeof(struct_A b)为12 觉得题目有问题?
不能够 struct_A a;这样定义结构体变量,应该是struct struct_A a;
>> 本文固定链接: http://www.vcgood.com/archives/1023
>> 转载请注明: peterzhu_1 2006年08月31日 于 C语言帝国 发表
可能是编译系统的问题,不同的编译系统得出的结果不一样
struct_A a;和struct struct_A a;都是可以的,并没有硬性规定.
至于sizeof(struct_A a);和sizeof(struct_B b);为什么不一样,这个涉及到了字节对齐的问题.
因为在某些系统上读取数据是从偶数地址开始的,比如int型数据(32位宽的)在32位的系统上,如果存放在偶数地址上,一个指令周期就可以把数据读完,而如果存放在奇数地址上则需要读取两次并把两次读取结果拼凑起来.这样在执行效率上有所损失,所以在没有特殊声明的情况下C语言一般把数据对齐到偶数地址上(按int型的位宽对齐)
比如下面的两个结构
struct struct_A {
int a; // int型 占4个字节 对齐后占4字节
char b; // char型 占1个字节 对齐后占4字节
int c; // int型 占4个字节 对齐后占4字节
short d; // short型 占2个字节 对齐后占4字节
};
//还有需要注意的是一个变量占多少字节是需要看上下两个变量的
struct struct_B {
int a; // int型 占4个字节 对齐后占4字节
char b; // char型 占1个字节 对齐后占4字节
short c; // short型 占2个字节 对齐后占4字节(因为和上一个变量相加占3个字节所以一起占4个字节)
int d; // int型 占4个字节 对齐后占4字节
};
这个就是为什么sizeof(struct_A a)为16,sizeof(struct_B b)为12的原因了.
当然有些时候你不需要C语言帮你对齐字节或想指定对齐的字节数.
这个时候你需要在结构前面添加这个宏.#progma pack (x) // x表示对其到x字节
比如
#progma pack (1) // 对齐到1字节,也就是各个数据类型的原始字节数,
struct struct_A {
int a;
char b;
int c;
short d;
};
struct struct_B {
int a;
char b;
short c;
int d;
};
则sizeof(struct_A a)和sizeof(struct_B b)都是11了.
#progma pach() //为取消指定的字节对齐,恢复默认的字节对齐
版主真乃高人也,以后要多向版主学习!