我有一些代码可以从数据库中读取“ db_data”(类型为std :: vector),并将其解释为ipsecSeqTable_t的数组。 一些代码如下:
typedef struct ipsecSeqTable
{
uint64_t seq;
uint64_t oseq;
uint32_t spi;
} ipsecSeqTable_t;
ipsecSeqTable_t* seq_data = reinterpret_cast<ipsecSeqTable_t*>(&db_data[0]);
uint32_t seq_data_count = db_data.size()/sizeof(ipsecSeqTable_t);
for (uint32_t i=0; i<seq_data_count; i++)
{
seq_data = seq_data + i;
printf("seq_data addr %ld", reinterpret_cast<int64_t>(seq_data ))
....
此代码不起作用(错误解释了db_data)。通过一些日志记录,我发现问题出在“ seq_data = seq_data + i”中,我得到了以下打印信息:
seq_data addr 140737018602320
seq_data addr 140737018602344
seq_data addr 140737018602392
seq_data addr 140737018602464
sieof(ipsecSeqTable_t)是24,所以我希望地址加24 * i,所以 第3个seq_data地址应为140737018602368,第4个应为140737018602392
如果我将seq_data = seq_data + i改为以下:
ipsecSeqTable_t* temp_seq_data = seq_data + i;
我得到正确的解释,并且打印temp_seq_data得到:
temp_seq_data addr 140737018602320
temp_seq_data addr 140737018602344
temp_seq_data addr 140737018602368
temp_seq_data addr 140737018602492
有人可以解释为什么“ seq_data = seq_data + i”是错误的吗? 预先谢谢你。
答案 0 :(得分:1)
seq_data = seq_data + i;
与seq_data += i;
相同-即seq_data向右移i
次。
我相信您正在尝试将seq_data移动到“ i
原始位置右侧的空格”,这就是您的带有临时变量的代码所执行的操作,因为每次都引用原始位置。另外,您可以将seq_data向右移动一次,这是这样的:
for (uint32_t i=0; i<seq_data_count; i++) {
seq_data = seq_data + 1; // or seq_data += 1; or ++seq_data;
printf("seq_data addr %ld", reinterpret_cast<uint64_t>(seq_data ))
....
}