首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >适用于字符字符串的混叠规则

适用于字符字符串的混叠规则
EN

Stack Overflow用户
提问于 2014-05-09 17:52:17
回答 1查看 63关注 0票数 0

我不明白为什么这段代码会触发混叠警告:

代码语言:javascript
复制
char buf[15];

*(uint16_t*) buf = 0x4040;

在char类型中没有任何可想象的“对齐”。不管怎样,我该如何优雅地做这件事呢?到目前为止,我想不出比

代码语言:javascript
复制
char buf[15];
uint16_t foo = 0x4040;
memcpy(buf, &foo, 2);

警告如下:

代码语言:javascript
复制
warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-09 18:01:11

在char类型中没有任何可想象的“对齐”。

这就是问题所在,一个char数组通常有最小的对齐要求,即1。

但是,您的代码试图将其视为一个uint16_t,它可能具有与1(通常为2)不同的对齐要求。

你在这里得到的解决方案是合理的:

代码语言:javascript
复制
char buf[15];
uint16_t foo = 0x1234; //changed this to demonstrate endian issue
memcpy(buf, &foo, 2);

请注意,这两种方法都是buf的内容将取决于您的主机的端点,即您将最终得到的一个小终端系统。

代码语言:javascript
复制
buf[0] == 0x34;
buf[1] == 0x12;

而在大终端系统中,值将被逆转。如果这没什么关系的话,那一切都很好。如果这是一个问题,而不是memcpy(),您可以这样做:

代码语言:javascript
复制
 buf[0] = foo & 0xff;
 buf[1] = foo >> 8;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23571058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档