char errorString[20];
*(UInt32*)(errorString + 1) = CFSwapInt32HostToBig(statusCode);
我在一本关于音频编程的书中找到了这一点,考虑到CFSwapInt32HostToBig
返回一个 Int32,我不明白为什么它需要进行这种奇怪的转换以及为什么它从char
缓冲区中第二个元素 (+1) 的地址开始分配。
本次作业后将errorString
包含什么内容?
char errorString[20];
*(UInt32*)(errorString + 1) = CFSwapInt32HostToBig(statusCode);
我在一本关于音频编程的书中找到了这一点,考虑到CFSwapInt32HostToBig
返回一个 Int32,我不明白为什么它需要进行这种奇怪的转换以及为什么它从char
缓冲区中第二个元素 (+1) 的地址开始分配。
本次作业后将errorString
包含什么内容?
errorString+1
(类型为char*
)被强制转换为指向的指针UInt32
,然后取消引用。errorString
因此,从第二个到第五个 ( errorString[1]
... )的四个后续字节errorString[4]
将包含一个整数的二进制表示,它是 的结果CFSwapInt32HostToBig(statusCode)
。
我不明白为什么要制作那种奇怪的演员表
演员表对于避免将数据截断为单个是必要的char
:如果你放弃演员表,像这样
*(errorString + 1) = CFSwapInt32HostToBig(statusCode);
该分配将修改单个char
. 实际上,它是这样的:
*(errorString + 1) = (char)CFSwapInt32HostToBig(statusCode);
这不是代码作者想要的。
就添加一个字节而言,答案取决于使用errorString
: 很可能,其他一些数据应该去那里。
CFSwapInt32HostToBig
返回一个 32 位类型的值,但errorString
它是一个char
.
程序员希望将 4 个字节存储到char
从 position 开始的数组中&errorString[1]
。
请注意,这是不安全的,应该避免,因为它会破坏别名规则并可能破坏对齐。