结构体的字节对齐和位域操作

取消字节对齐

在结构体声明当中,加上__attribute__ ((__packed__))关键字,可以让结构体,按照紧凑排列的方式来占用内存,结构体的长度,就是各个变量长度的和。

#include<stdio.h>
#include <stdint.h>
struct  node1
{
	uint8_t a;
	uint16_t b;
	uint32_t c;
}__attribute__ ((__packed__));
struct node2
{
	uint8_t a;
	uint16_t b;
	uint32_t c;
};
int main()
{
	struct node1 tmp1;
	struct node2 tmp2;

    printf("紧凑:%ld   非紧凑:%ld\n",sizeof(tmp1),sizeof(tmp2));
    return 0;

}

输出结果:

紧凑:7   非紧凑:8

node1采用紧凑排列,1+2+4=7

node2它采用了2字节对齐的方式,2+2+4=8

位域操作

指定变量所占位的个数

#include<stdio.h>
#include <stdint.h>
struct  node1
{
	uint8_t a:8;
	uint16_t b:8;
	uint32_t c:8;
}__attribute__ ((__packed__));
struct node2
{
	uint8_t a;
	uint16_t b;
	uint32_t c;
};
int main()
{
	struct node1 tmp1;
	struct node2 tmp2;

    printf("紧凑:%ld   非紧凑:%ld\n",sizeof(tmp1),sizeof(tmp2));
    return 0;

}

输出结果:

紧凑:3   非紧凑:8

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
结构体字节对齐引起的访问越界问题通常出现在以下情况下: 1. 结构体中存在字节对齐的成员变量,访问该成员变量时,可能会访问到结构体之外的内存空间。例如,如果某个成员变量的长度是4字节,但该结构体字节对齐方式是8字节,那么访问该成员变量时,可能会访问到结构体之外的4字节内存空间,从而导致访问越界。 2. 结构体中存在数组类型的成员变量,访问该数组时,可能会访问到数组之外的内存空间。例如,如果一个数组的长度是10,但该结构体字节对齐方式是16字节,那么访问该数组时,可能会访问到数组之外的6字节内存空间,从而导致访问越界。 为了避免结构体字节对齐引起的访问越界问题,可以采取以下措施: 1. 使用编译器提供的或自定义的对齐方式,以确保结构体中成员变量的对齐方式符合要求。 2. 避免在结构体中使用数组类型的成员变量,或者使用动态内存分配等方法来管理数组,以确保数组访问不会越界。 3. 避免在结构体中使用位域类型的成员变量,或者使用位运算等方法来确保位域访问不会越界。 4. 在编写代码时,注意检查结构体中的成员变量访问是否越界,可以使用断言等方法来检查访问边界。 总之,结构体字节对齐引起的访问越界问题需要引起重视,需要在编写代码时注意结构体成员变量的对齐方式和访问边界,以确保程序的正确性和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值