我正在阅读 USB Wi-Fi 卡的 C 驱动程序代码,并且遇到了我不确定我是否完全理解的部分。我怀疑是我对 C 语言和运算符优先级的理解是错误的,并且驱动程序代码很好,但我想检查一下。
In/drivers/net/wireless/rtl818x/rtl8187/dev.c
是一些将一堆值读入 14 元素channels
数组的代码。相关代码dev.c
如下:
channel = priv->channels;
for (i = 0; i < 3; i++) {
eeprom_93cx6_read(&eeprom, RTL8187_EEPROM_TXPWR_CHAN_1 + i,
&txpwr);
(*channel++).hw_value = txpwr & 0xFF;
(*channel++).hw_value = txpwr >> 8;
}
for (i = 0; i < 2; i++) {
eeprom_93cx6_read(&eeprom, RTL8187_EEPROM_TXPWR_CHAN_4 + i,
&txpwr);
(*channel++).hw_value = txpwr & 0xFF;
(*channel++).hw_value = txpwr >> 8;
}
....
if (!priv->is_rtl8187b) {
for (i = 0; i < 2; i++) {
eeprom_93cx6_read(&eeprom,
RTL8187_EEPROM_TXPWR_CHAN_6 + i,
&txpwr);
(*channel++).hw_value = txpwr & 0xFF;
(*channel++).hw_value = txpwr >> 8;
}
} else {
eeprom_93cx6_read(&eeprom, RTL8187_EEPROM_TXPWR_CHAN_6,
&txpwr);
(*channel++).hw_value = txpwr & 0xFF;
eeprom_93cx6_read(&eeprom, 0x0A, &txpwr);
(*channel++).hw_value = txpwr & 0xFF;
eeprom_93cx6_read(&eeprom, 0x1C, &txpwr);
(*channel++).hw_value = txpwr & 0xFF;
(*channel++).hw_value = txpwr >> 8;
}
我对这段代码的担忧是,我会认为第一次调用会在取消引用之前(*channel++).hw_value = ...
增加通道指针,从而从通道元素开始并缺少元素。此外,无论执行哪个 if/else 分支,我都会计算 14 次对 的调用,所以我会认为最后一次调用实际上会指向(不存在)并覆盖任何变量的内存。堆栈。谁能指出我的解释可能出错的地方?[1]
[0]
(*channel++)...
(*channel++)
channel[15]
channels