记录一次alignment fault

本文详细解析了在ARM处理器上遇到的alignmentfault问题,尤其是在使用std::cout输出double类型时出现的问题。通过分析结构体内存对齐不当的原因,提供了一种封装结构以达到内存对齐的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题现象

最近在调试程序的时候,发现会有异常退出情况,错误提示为:alignment fault。
通过gdb 调试发现是在std::cout 是对double类型的输出有问题,导致了此次的alignment fault。

问题原因

在我的程序中用到了1字节对齐,结构体内容大体上像下面这种结构,导致了double夸字节访问,
在ARM处理器中对非对齐内存访问不是特别友好。
alignment fault具体介绍参考另一篇博客

#param pack(1)
struct test
{
	char testc;
	double testd;
};
#param pack()

测试时还发现,正常使用没有问题,但是通过流输出是就会出现异常。
正常使用:

struct test mT;
if(mT.testd > 3.44)
{}

解决方法

为了能够通过流进行输出,最后通过封装一层结构,达到内存对齐。
如此封装之后就可以正常使用了,因为double达到了8字节对齐。

#param pack(1)
struct test
{
	char testc;
	double testd;
};
struct testFix
{
	char testFixC[7]
	struct test testStr;
}
#param pack()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值