新闻中心

EEPW首页>嵌入式系统>设计应用> 漫谈c语言结构体

漫谈c语言结构体

作者: 时间:2016-12-01 来源:网络 收藏

}

#include
        
         int main(){struct //声明结构体char_short_long{char c;short s;long l;}char_short_long;struct //声明结构体long_short_char{long l;short s;char c;}long_short_char;struct //声明结构体char_long_short{char c;long l;short s;}char_long_short;printf(" ");printf(" Size of char = %d bytes",sizeof(char));printf(" Size of shrot = %d bytes",sizeof(short));printf(" Size of long = %d bytes",sizeof(long));printf(" "); //char_short_longprintf(" Size of char_short_long = %d bytes",sizeof(char_short_long));printf(" Addr of char_short_long.c = 0x%p (10进制:%d)",&char_short_long.c,&char_short_long.c);printf(" Addr of char_short_long.s = 0x%p (10进制:%d)",&char_short_long.s,&char_short_long.s);printf(" Addr of char_short_long.l = 0x%p (10进制:%d)",&char_short_long.l,&char_short_long.l);printf(" ");printf(" "); //long_short_charprintf(" Size of long_short_char = %d bytes",sizeof(long_short_char));printf(" Addr of long_short_char.l = 0x%p (10进制:%d)",&long_short_char.l,&long_short_char.l);printf(" Addr of long_short_char.s = 0x%p (10进制:%d)",&long_short_char.s,&long_short_char.s);printf(" Addr of long_short_char.c = 0x%p (10进制:%d)",&long_short_char.c,&long_short_char.c);printf(" ");printf(" "); //char_long_shortprintf(" Size of char_long_short = %d bytes",sizeof(char_long_short));printf(" Addr of char_long_short.c = 0x%p (10进制:%d)",&char_long_short.c,&char_long_short.c);printf(" Addr of char_long_short.l = 0x%p (10进制:%d)",&char_long_short.l,&char_long_short.l);printf(" Addr of char_long_short.s = 0x%p (10进制:%d)",&char_long_short.s,&char_long_short.s);printf(" ");return 0;}
        


程序的运行结果如下(注意:括号内的数据是成员变量的地址的十进制形式):

2.结构体成员变量内存对齐

首先,我们来分析一下上面程序的运行结果。前三行说明在我的程序中,char型占1个字节,short型占2个字节,long型占4个字节。char_short_long、long_short_char和char_long_short是三个结构体成员相同但是成员变量的排列顺序不同。并且从程序的运行结果来看,

Size of char_short_long =8bytes
Sizeof long_short_char=8bytes
Sizeof char_long_short=12bytes//比前两种情况大4byte!

并且,还要注意到,1 byte (char)+2byte(short)+4 byte(long) = 7 byte,而不是8 byte。

所以,结构体成员变量的放置顺序影响着结构体所占的内存空间的大小。一个结构体变量所占内存的大小不一定等于其成员变量所占空间之和。如果一个用户程序或者操作系统(比如uC/OS-II)中存在大量结构体变量时,这种内存占用必须要进行优化,也就是说,结构体内部成员变量的排列次序是有讲究的。

结构体成员变量到底是如何存放的呢?

在这里,我就不卖关子了,直接给出如下结论,在没有#pragmapack宏的情况下:

原则1结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。

原则2结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。

*原则3结构体作为成员时,结构体成员要从其内部最大元素大小的整数倍地址开始存储。(structa里存有structb,b里有char,int,double等元素时,那么b应该从8的整数倍地址处开始存储,因为sizeof(double)=8bytes)

这里,我们结合上面的程序来分析(暂时不讨论原则3)。

先看看char_short_long和long_short_char这两个结构体,从它们的成员变量的地址可以看出来,这两个结构体符合原则1和原则2。注意,在char_short_long的成员变量的地址中,char_short_long.s的地址是1244994,也就是说,1244993是“空的”,只是被“占位”了!



关键词:c语言结构

评论


技术专区

关闭