[疑惑]关于memset对结构体清零

C语言 码拜 9年前 (2016-04-19) 2378次浏览
问题是这样的:
环境keil(一种嵌入式的IDE)
typedef struct _RIP_MSG
{
uint8_t  op;
uint8_t  htype;
uint8_t  hlen;
uint8_t  hops;
uint32_t xid;
uint16_t secs;
uint16_t flags;
uint8_t  ciaddr[4];
uint8_t  yiaddr[4];
uint8_t  siaddr[4];
uint8_t  giaddr[4];
uint8_t  chaddr[16];
uint8_t  sname[64];
uint8_t  file[128];
uint8_t  OPT[312];
}RIP_MSG;
uint8_t EXTERN_DHCPBUF[1024];
RIP_MSG*  pRIPMSG = (RIP_MSG*)EXTERN_DHCPBUF;
上面是定义了一个结构体,一段可用空间,以及让结构体指针指向这段空间的首地址。一切看上去还很平静。
当执行:
memset((void *)pRIPMSG, 0, sizeof(RIP_MSG));语句时,偶尔会死机。
原因后来发现了,当
uint8_t EXTERN_DHCPBUF[1024] __attribute__((aligned(4))); 对该数组四字节对齐时,就不会出错。
然后本人就怀疑是 memset的问题,网上也有提到,memset需要4字节对齐。
好奇的本人又在VS2010下执行了memset((void *)pRIPMSG, 0, sizeof(RIP_MSG));语句,而且还特意
pRIPMSG = (RIP_MSG*)((uint64_t)pRIPMSG | 1); 让它地址不对齐。运行时不会死机。
本人觉得可能是,在嵌入式开发时,基本是直接对内存进行操作,所以不对齐,执行到memset就会死机;
但在vs环境下,本身提供的地址就是虚拟地址,全部与硬件相关的操作都被封装起来了,屏蔽掉了。
希望大家来讨论下。谢谢。
说了这么多本人有两个疑惑:
1、为什么VS不会死机,在KEIL下会出现死机?本人上面的想法对不?
2.KEIL下为什么不对齐就会死机?想高手从memset实现的方式上进行分析。
解决方案

20

印象中VS的memset的实现是不需要4字节对齐的
也可能某些系统上memset使用特殊的实现,要求数据必须对齐。

20

但他说的是“偶尔会死机”,并不是数组没有32位对齐就导致死机。所以本人觉得这不是memset要求目标地址4字节对齐造成的,应该没有这种限制。而是struct _RIP_MSG这个结构编译器是做了对齐处理的,你把它放在非对齐地址上,生成的代码访问成员可能错位了,这本身也不会造成死机,而是在数据处理部分出现问题。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明[疑惑]关于memset对结构体清零
喜欢 (0)
[1034331897@qq.com]
分享 (0)