C语言 -- 结构体字节对齐题目示例
结构体字节对齐题目示例
在做题之前先来看看:
以下题目都是在.c文件中运行。 常说熟能生巧,多做几道题,多分析分析~
struct s1
{
char c1; //1 +3
int i; //4
char c2; //1 + 3
};
struct s2
{
char c1; //1
char c2; //1 +2
int i; //4
};
void main()
{
printf("sizeof(s1) = %d
", sizeof(struct s1)); //12
printf("sizeof(s2) = %d
", sizeof(struct s2)); //8
}
typedef struct Test
{
short a; //2 +6
struct
{
int b; //4 +4
double c; //8
long d; //4 +4
};
int e; //4 +4
}Test;
void main()
{
printf("%d
", sizeof(Test)); //40
}
typedef struct Test
{
char a; //1 +7
double b; //8
int c; //4 +4
}Test;
void main()
{
printf("%d
", sizeof(Test)); //24
}
typedef struct Test
{
char a; //1 +3
int c; //4
double b; //8
}Test;
void main()
{
printf("%d
", sizeof(Test)); //16
}
#pragma pack(2)//指定按两个字节对齐
typedef struct Test
{
char a; //1 +1
int c; //4
double b; //8
}Test;
void main()
{
printf("%d
", sizeof(Test)); //14
}
#pragma pack(2)//指定按两个字节对齐
typedef struct Test
{
char a; //1
char b; //1
char c; //1
}Test;
void main()
{
printf("%d
", sizeof(Test)); //3
}
typedef struct Test
{
short a; //2 +6
struct
{
int b; //4 +4
double c; //8
char d; //1 +7
};
int e; //4 +4
}Test;
void main()
{
printf("%d
", sizeof(Test)); //40
}
typedef struct Test
{
short a; //2 +6
struct
{
int b; //4 +4
double c[10]; //80
char d; //1 +7
};
int e; //4 +4
}Test;
void main()
{
printf("%d
", sizeof(Test)); //112
}
#pragma pack(2)//指定按两个字节对齐
typedef struct Test
{
short a; //2
struct
{
int b; //4
double c; //8
char d; //1 +1
};
int e; //4
}Test;
void main()
{
printf("%d
", sizeof(Test)); //20
}
//下面程序在.c中输出是32,.cpp中输出为8
typedef struct Test
{
short a; //2 +6
struct t //原因是这个t,有名字之后就是个类型
{
double c; //8
int b; //4
char d; //1 +3
};
int e; //4 +4
}Test;
void main()
{
printf("%d
", sizeof(Test));
}
#pragma pack(4)
typedef struct Test
{
unsigned long a;
unsigned short b[7];
unsigned char c;
}Test;
void main()
{
Test T, * pt;
unsigned short* pu[10][10];
printf("%d
", sizeof(pu)); //400
printf("%d
", sizeof(T)); //20
printf("%d
", sizeof(pt)); //4
printf("%d
", sizeof(*pt)); //20
}
