繁体   English   中英

该代码的作用是什么

[英]What exactly does this code do

我正在查看一些C代码,并遇到了以下语法:

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

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

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

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

它复制b[0]到的一部分a 哪些特定部分取决于:

  • 字节顺序:小字节序或大字节序

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

注:“字节”在修改a将永远第一个字节。 字节顺序很重要,因为第一个字节可能是最有意义的或不太有意义的。

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

注意:如果仅使用“ POST”(或“ TSOP”)作为比较,则可能会收到有关多字节字符的警告,解决方法(而不是关闭警告)是使用('P'|'O'<< 8 |'S'<< 16 |'T'<< 24),反之亦然,具体取决于字节顺序-它将编译为const int,可在switch()中使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM