由于在x86(32位机器)平台下,GCC编译器默认按4字节对齐,
如:结构体4字节对齐,即结构体成员变量所在的内存地址是4的整数倍。
可以通过使用gcc中的__attribute__选项来设置指定的对齐大小。
1):
attribute ((packed)),让所作用的结构体取消在编译过程中的优化对齐,
按照实际占用字节数进行对齐。
2):
__attribute((aligned (n))),让所作用的结构体成员对齐在n字节边界上。
如果结构体中有成员变量的字节长度大于n,
则按照最大成员变量的字节长度来对齐。
代码如下:
struct person{
char *name;
int age;
char score;
int id;
};
struct person1{
char *name;
int age;
char score;
int id;
}__attribute__ ((packed));
struct person2{
char *name;
int age;
char score;
int id;
}__attribute((aligned (4)));
int main(int argc,char **argv)
{
struct person per={"www.100ask.org",10,'A',123};
printf("sizeof(char )=%dn",sizeof(char ));
printf("sizeof(int )=%dn",sizeof(int ));
printf("sizeof(char *)=%dn",sizeof(char *));
printf("sizeof(char **)=%dn",sizeof(char **));
printf("sizeof(struct person)=%dn",sizeof(struct person));
printf("sizeof(struct person1)=%dn",sizeof(struct person1));
printf("sizeof(struct person2)=%dn",sizeof(struct person2));
printf("&per.name =%p,per.name =%sn",&per.name ,per.name);
printf("&per.age =%p,per.age =%dn",&per.age ,per.age);
printf("&per.score =%p,per.score =%dn",&per.score,per.score);
printf("&per.id =%p,per.id =%dn",&per.id ,per.id);
return 0;
}
结果为:
sizeof(char )=1
sizeof(int )=4
sizeof(char *)=4
sizeof(char **)=4
sizeof(struct person)=16
sizeof(struct person1)=13
sizeof(struct person2)=16
&per.name =0xbfe6bf60,per.name =www.100ask.org
&per.age =0xbfe6bf64,per.age =10
&per.score =0xbfe6bf68,per.score =65
&per.id =0xbfe6bf6c,per.id =123
上一篇:jz2440裸机开发与分析:串口编程3之printf解析
下一篇:jz2440裸机开发与分析:串口编程5之串口实现printf
推荐阅读最新更新时间:2024-11-01 20:37
设计资源 培训 开发板 精华推荐
- VN5E050J评估板
- LZ1AQ小环天线放大器
- LTC4162EUFD-FFSM 1-9 节、3.2A 降压型开关电池充电器的典型应用,具有 PowerPath
- 用于卤素灯和低功耗灯的数字墙调光器
- 基于NCN5150 SOIC总线收发器的NCN5150SOICGEVB、NCN5150NGEVB评估板
- PCAL6534EV 34位通用IO Arduino® Shield扩展板
- 安全管家
- 使用 ON Semiconductor 的 LV5105FN 的参考设计
- DC675A-D,演示电路具有 LT1568CGN、单 4 阶、1MHz 带通滤波器、有源 RC 滤波器构建块
- 2021年G题-植保飞行器+零队