我不明白为什么这段代码会触发混叠警告:
char buf[15];
*(uint16_t*) buf = 0x4040;在char类型中没有任何可想象的“对齐”。不管怎样,我该如何优雅地做这件事呢?到目前为止,我想不出比
char buf[15];
uint16_t foo = 0x4040;
memcpy(buf, &foo, 2);警告如下:
warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]发布于 2014-05-09 18:01:11
在char类型中没有任何可想象的“对齐”。
这就是问题所在,一个char数组通常有最小的对齐要求,即1。
但是,您的代码试图将其视为一个uint16_t,它可能具有与1(通常为2)不同的对齐要求。
你在这里得到的解决方案是合理的:
char buf[15];
uint16_t foo = 0x1234; //changed this to demonstrate endian issue
memcpy(buf, &foo, 2);请注意,这两种方法都是buf的内容将取决于您的主机的端点,即您将最终得到的一个小终端系统。
buf[0] == 0x34;
buf[1] == 0x12;而在大终端系统中,值将被逆转。如果这没什么关系的话,那一切都很好。如果这是一个问题,而不是memcpy(),您可以这样做:
buf[0] = foo & 0xff;
buf[1] = foo >> 8;https://stackoverflow.com/questions/23571058
复制相似问题