首页 > 解决方案 > 整数常量指向的对象的默认类型

问题描述

给定一个内存地址,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 的指针的强制转换违反了?这段代码是否由标准定义好(考虑到地址与结构大小对齐并且结构内没有填充)?

标签: clanguage-lawyerstrict-aliasing

解决方案


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

不——部分是因为整数常量不指向任何东西。

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

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

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

这意味着即使您确实有另一个指向同一位置的不兼容类型的指针,除非您通过一个指针存储并通过另一个指针加载,否则它不会成为问题。char*无论如何,整数常量或 a or都不是void*“不兼容类型的指针”。


推荐阅读