这段代码到底是做什么的

时间:2013-09-29 00:44:38

标签: c

我正在浏览一些c代码并遇到了这种语法:

uint16 a;
unsigned char *b;
//b is initilized elsewhere before the next line gets called
((unsigned char*) &a)[0] = b[0];

这是我没有得到的最​​后一行。我们将uint16的地址类型化为unsigned char。为什么是这样? & a的地址可能大于8个字节。还有什么是等于左边的[0]?

3 个答案:

答案 0 :(得分:2)

您正在使用a的地址,将其投放到unsigned char* unsigned char),向其添加0(无操作) ,取消引用它,然后将b[0]的结果分配给它。换句话说,您将b[0]的结果分配给a的内存中表示的第一个字节。

由于b尚未初始化,因此会调用未定义的行为。

答案 1 :(得分:2)

b[0]复制到a的一部分。具体部分取决于:

  • Endianness:小端或大端

  • 每种类型的大小(uint16将使用2个字节,unsigned char可能使用1个。

注意:a中修改的“byte”将始终是第一个字节。字节序很重要,因为第一个字节可能是最有意义的或不那么有意义的。

答案 2 :(得分:0)

这在int类型中更常见,您希望一次使用整个单词进行优化。假设您要比较一大组字符串,但只需要比较前4个字符。您可以将每个char数组转换为int并进行直接比较,而不是使用一系列缓慢的strncmp()。 Web服务器中常见的用于GET,POST,HEAD ...请求。根据您的字节顺序,强制转换值可能采用“TSOP”或“POST”形式,其他类型(包括您的uint16)也是如此,因此您使用的代码可能没有一些#ifdefs

便携

注意:如果您只是使用'POST'(或'TSOP')作为比较,您可能会收到有关多字节字符的警告,解决方法(除了转动警告之外)就是使用('P'|'O' << 8 |'S'<< 16 |'T'<<<<<<<<<"< 16 |'T'<<<<<<<<< 16"<<<<<< 16> p>