1
char errorString[20];
*(UInt32*)(errorString + 1) = CFSwapInt32HostToBig(statusCode);

我在一本关于音频编程的书中找到了这一点,考虑到CFSwapInt32HostToBig返回一个 Int32,我不明白为什么它需要进行这种奇怪的转换以及为什么它从char缓冲区中第二个元素 (+1) 的地址开始分配。

本次作业后将errorString包含什么内容?

4

3 回答 3

7

errorString+1(类型为char*)被强制转换为指向的指针UInt32,然后取消引用。errorString因此,从第二个到第五个 ( errorString[1]... )的四个后续字节errorString[4]将包含一个整数的二进制表示,它是 的结果CFSwapInt32HostToBig(statusCode)

于 2013-06-08T11:39:57.113 回答
3

我不明白为什么要制作那种奇怪的演员表

演员表对于避免将数据截断为单个是必要的char:如果你放弃演员表,像这样

*(errorString + 1) = CFSwapInt32HostToBig(statusCode);

该分配将修改单个char. 实际上,它是这样的:

*(errorString + 1) = (char)CFSwapInt32HostToBig(statusCode);

这不是代码作者想要的。

就添加一个字节而言,答案取决于使用errorString: 很可能,其他一些数据应该去那里。

于 2013-06-08T11:40:57.887 回答
3

CFSwapInt32HostToBig返回一个 32 位类型的值,但errorString它是一个char.

程序员希望将 4 个字节存储到char从 position 开始的数组中&errorString[1]

请注意,这是不安全的,应该避免,因为它会破坏别名规则并可能破坏对齐。

于 2013-06-08T11:41:38.123 回答