在内存中,结构不一定是它表面看起来那么大。
typedef struct
{
char abc[2];
int i;
} ABC;
printf("%d/n",sizeof(ABC));//结果为 8
注:
具体的大小依赖于编译器的字节对齐情况。有些编译器甚至会调整结构中的成员的排列顺序。
即使空结构,也不会为0字节,可能是避免为零时,空结构的地址就等于紧接它的数据的地址。
typedef struct
{} EMPTY //在VC下,sizeof(EMPTY)是1。
-----------------------------------------------------------------------------------------
结构是传值。
C的结构'='为赋值操作,如
typedef struct {int x,int y} Long64;
Long64 a, b;
a=b;
但不能赋予不同类型的值,即使类型的总位数相同。
如
long long c=0;
a = c;// 报告不兼容类型
本来相同的就可以,如
typedef int jint;
int i=0;
jint j=0;
i=j; // correct
-----------------------------------------------------------------------------------------
可以初始化结构
struct Shape
{
int type;
float radius;
} Circle = {1,2};
结构允许嵌套
struct
{
struct
}
结构的继承
如CLDC中的:
struct filePointerStruct {
/* If set to true, indicates a JAR file */
bool_t isJarFile;
};
struct stdioPointerStruct {
bool_t isJarFile;
/* Always TRUE */
long size;
/* size of file in bytes */
FILE* file;
/* Pointer to class file */
};
struct jarPointerStruct {
bool_t isJarFile;
/* always FALSE */
long dataLen;
/* length of data stream */
long dataIndex;
/* current position for reading */
unsigned char data[1];
};
在使用时可以用 (struct jarPointerStruct*)ClassFile;类似面向对象的强制类型转换。
注意:它的结构前面的共有部分要相同。
-----------------------------------------------------------------------------------------
段位结构
struct Date
{
unsigned month:4;
unsigned day:5;
unsigned year:7;
} date;
如果没有用到一个字节的所有位,则不用的位初始为零。假如,赋予的字段的值溢出,在VC下不会进位到下一个字段。
typedef
union _ABC
{
int i;
struct
{
short s1:1;
short s2:2;
};
} abc;
联合和结构中,指定位数只能指定小于或等于类型的长度。
如:
short s2:24 就有错,因为short只有16位长。
同时,对s1和s2赋值只影响其声明的位,如s1=3并不会溢出存到s2。
而且,段的类型仍然为定义时的类型,不会因为只涉及其中的一部分位而消失。
---------------------------------------------------------------------------------
见到有些结构故意填加字节,使结构边界对齐(不依赖于编译器)
typedef struct
{
U16 data;
U8 len;
U8 pad; // here
} SatSmsPdu;
---------------------------------------------------------------------------------
拷贝结构部分的方法
struct A{int i; int j;};
struct A sa, sb;
memcpy(&sa, &sb, &(((struct A*)0)->j)); //拷贝前面部分到j