我不明白为什么这段代码会触发别名警告:
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]
答案 0 :(得分:0)
没有任何可以想象的"对齐"在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
的内容取决于主机的端点,即on
你最终会得到一个小端系统
buf[0] == 0x34;
buf[1] == 0x12;
在大端系统上,值将被反转。如果这没关系,那么一切都很顺利。 如果这是一个问题,而不是memcpy(),你可以这样做:
buf[0] = foo & 0xff;
buf[1] = foo >> 8;