【发布时间】:2016-04-15 00:41:46
【问题描述】:
unsigned int addr = 0x1000;
int temp = *((volatile int *) addr + 3);
它是否将递增的指针(即addr + 3 * sizeof(int))视为指向volatile int 的指针(解除引用时)。换句话说,我可以期待 temp 中 say (0x1012) 的硬件更新内容吗?
【问题讨论】:
-
addr是什么类型?char*?我怀疑这违反了严格的别名规则 -
那么我会假设这违反了严格的别名规则。但是,是的,如果你在地毯下刷它(你不应该,它的 UB),你将
addr转换为int*,同时假设ints 在你的机器上是 4 个字节,这将执行指针运算和取消引用将从addr增加 12 个字节 -
0x1000不是 C 中的有效指针,而是整数常量。 -
@yano:请详细说明。如果实现定义了转换,但不是 UB。取消引用是 C 标准中公认的缺陷(请参阅缺陷报告),也是大多数(如果不是全部)实现中的常见做法。
-
@jithu83 我会说,“是的”。指针算术不会改变指针的类型或其限定符。但是我在 C 规范中找不到直截了当的陈述,所以我不会发布答案。如果您需要规范中的引用,那么您应该将其中一个标签更改为“language-lawyer”。
标签: c pointers linux-device-driver volatile low-level-io