适用于char字符串的别名规则

时间:2014-05-09 17:52:18

标签: c strict-aliasing

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

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]

1 个答案:

答案 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;