C语言的注意点

参考:http://blog.csdn.net/RadianceBlau/article/details/60867307


#include<stdio.h>

int main(){
typedef struct A{
char b;
int  c;
double d;
char a;
}a;
typedef struct B{
char a;
char b;
int  c;
double d;
}b;
printf("%d%d%.2f",sizeof(a),sizeof(b),sizeof(a)/sizeof(b));

输出 24 16 0.00  (我的电脑是64位)

结构体:涉及内存对齐以提高内存的利用率,位段的使用。

因为32位机器的内存是以4字节对齐的  所以第一个就是4 8 8 4

第二个就是两个char4个字节 4 4  4 4  


约定为32位系统,即char 1字节、short 2字节、int 4字节

该问题总结为两条规律:
1,每个结构体成员的起始地址为该成员大小的整数倍,即int型成员的其实地址只能为0、4、8等

2,结构体的大小为其中最大成员大小的整数倍


  1. struct A{  
  2.     char a;     //1  
  3.     int b;      //空3 + 4 = 7 (规则1)  
  4.     short c;    //2+空2=4 (规则2)  
  5. };  输出12
  6. struct B{  
  7.     char a;     //1  
  8.     short b;    //空1 + 2 = 3 (规则1)  
  9.     int c;      //4  
  10. };  输出8


上面是问题的简化版,其实还有另外两条规则,下面严格按照定义补充完整:

1,数据类型自身对齐

数据类型的起始地址为其大小的整数倍

2,结构体的自身对齐

结构体的自身对齐值为其中最大的成员大小

3,指定对齐

可以使用关键词#pragma pack(1) 来指定结构体的对齐值

4,有效对齐值

有效对齐值为自身对齐值与指定对齐值中较小的一个。(即指定对齐值超过自身对齐值无意义)

  1. #pragma pack(1)  
  2. struct A{  
  3.     char a;  
  4.     int b;  
  5.     short c;  
  6. };  输出7
  7. #pragma pack(1)  
  8. struct B{  
  9.     char a;  
  10.     short b;  
  11.     int c;  
  12. };  输出7

这个结果比较容易理解,struct成为了紧密型排列,之间没有空隙了。



  1. #pragma pack(8)  
  2. struct A{  
  3.     char a;  
  4.     int b;  
  5.     short c;  
  6. };  输出12
  7. #pragma pack(8)  
  8. struct B{  
  9.     char a;  
  10.     short b;  
  11.     int c;  
  12. };  输出8
与第一次结果相同,说明#pragma pack(8) 没有起到任何作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值