gpt4 book ai didi

c++ - 是什么让 volatile 中断指针算术与结构?

转载 作者:搜寻专家 更新时间:2023-10-31 00:24:33 26 4
gpt4 key购买 nike

<分区>

在我们的代码中,我们使用指向结构的指针来扣除硬件寄存器的地址,以保持代码的可读性。

例如:

#include <cstdint>
#include <iostream>

struct reg {
uint32_t t;
uint32_t x;
uint32_t value;
};

int main(void)
{
struct reg *r = reinterpret_cast<struct reg *>(0x800000);

std::cerr << &r->value << "\n";
std::cerr << &r->t << "\n";
std::cerr << &r->x << "\n";

return 0;
}

硬件基地址为 0x800000,使用 writeReg(&t->x, 123); 将写入 0x800004。

一不小心,volatile-关键字被错误地放置在结构定义中:


struct reg {
volatile uint32_t t;
volatile uint32_t x;
volatile uint32_t value;
};

现在发生的事情是,使用 &r->field-语法,所有字段都具有偏移量 1。

在这里使用 g++ (Debian 9.2.1-4) 9.2.1 20190821

使用 printf 和 C 风格的转换在 C 中重写测试,即使使用 volatile 也能再次给出正确的偏移量。

我无法理解为什么 volatile 关键字似乎破坏了指针算术?为什么会这样?发生了什么事?

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com