操纵变量的地址以存储较小的类型?

时间:2010-06-07 20:52:39

标签: c sanity-check sane

这是我用高级编程语言来呵护自己的方法。


我有一个函数,它将32位值写入缓冲区,并在堆栈上写入uint64_t。以下代码是一种理智的存储方式吗?

uint64_t size = 0;
// ...
getBytes((uint32_t*)&size+0x1);

我认为这将是规范,安全的风格:

uint64_t size = 0;
// ...
uint32_t smallSize;
getBytes(&smallSize);
size = smallSize;

2 个答案:

答案 0 :(得分:3)

没有。它只能在big-endian机器上正常工作。假设一个特定的字节顺序 - 甚至没有先检查它 - 是不理智的。

即使您确定您的程序目前仅在大端机器上运行,您也永远不会知道它是否可能在将来运行在小端机器上。 (我是在一家使用大端处理器数十年的公司制造的计算机上写的,几年前改用小端处理器,现在在某些设备中使用双端处理器也非常成功; ))

答案 1 :(得分:0)

为什么不让getBytes()返回uint64_t?并使用参数(例如int *)返回错误代码(如果有的话)。

根据我的个人经验,如果你真的想要统一两个代码路径,那么在两者中使用uint64_t。

另请注意,“(uint32_t *)& size”会破坏C​​99严格别名规则(例如,在GCC中,必须禁用优化)。