整数常量指向的对象的默认类型

Default type for object pointed by an integer constant

给定 ADDR_X 的内存地址,其中我有一些值的专用硬件寄存器,地址类型转换是否会违反严格的别名?

//lets use some arbitrary address for the sake of this example
#define ADDR_X 0xE0F0

void function(void)
{
    some_structure_type *my_struct_ptr = (some_structure_type *)ADDR_X;

    my_struct_ptr->a_field = 1;

    ...
}

是否存在整数常量指向的对象的默认类型,其中转换为指向 some_structure_type 的指针违反了?此代码是否由标准明确定义(假设地址与结构大小对齐并且结构内没有填充)?

Is there a default type for object pointed by an integer constant

否 - 部分原因是整数常量不指向任何东西。

指针指向事物,指针有类型,当不同类型的指针指向同一存储时,别名适用。

您在这里只显示一个 指针 ,类型为 some_structure_type*,因此该位置有一个名称、一种类型,并且没有别名。地址也存储在 int(或 intptr_t 或其他)中的事实不会将其他类型与其相关联。

您可以阅读对严格别名要求的描述here,但粗略地说,当您通过不兼容类型的指针写入和读取同一地址时,会出现实际问题,因为优化器是允许假设你没有这样做。

这意味着即使您确实有另一个指向同一位置的不兼容类型的指针,也不会成为问题,除非您通过一个指针存储并通过另一个指针加载。不管怎样,整数常量、char*void* 都不算作 "pointer of incompatible type"。