老码识途 数组和结构体

数组下标从0开始的优势:少计算一次减法,数=首地址+偏移元素大小;否则数=首地址+(偏移-1)元素大小
结构体对齐规律:
首先选定一个盒子,然后一次将字段往盒子里放,当盒子放不下后,又用下一个盒子放,直至所有字段存放完毕;
其中,盒子大小=min(max(sizeof(成员变量)),对齐长度)
其中的对齐长度在编译器的代码生成中设定,在C\c++–>代码生成–>结构成员对齐中,也可以使用代码:#pragma pack (value)来告诉编译器,使用我们指定的对齐值来取代缺省的。
#pragma pack (1) /*指定按2字节对齐*/ #pragma pack () /*取消指定对齐,恢复缺省对齐*/;
字段放入盒子的位置如下:离盒子头部偏移字节数=n*sizeof(成员变量)(n=0,1,2….);
结构体会产生填充,因此要安排变量的位置,尽量做到无填充对齐,

#include <iostream>
using namespace std;
struct pdf
{
//  char c;//以这种方式,将报文char[]转换成报文结构体时会因为填充而错误
//  int len;
    int len;
    char c;
};
int main()
{
    char buf[64];
    buf[1]=12;
    *(int *)&buf[0]=12;
//  buf[5]=0;
//  buf[6]=0;
//  buf[7]=0;
    pdf *pd;
    pd=(pdf *)buf;
    cout<<pd->c<<endl;
    cout<<pd->len<<endl;
    cout<<(int)buf[1]<<endl;
    //cout<<sizeof(P);
}

又例如:
struct hdr{char c;short n;char c2;};应该调整为struct hdr{char c;char c2;short n;};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值