为什么“ pointer = pointer + i”得到某种随机值

时间:2018-09-20 02:56:46

标签: c++ pointers

我有一些代码可以从数据库中读取“ 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”是错误的吗? 预先谢谢你。

1 个答案:

答案 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 ))
    ....
}