c - 整数常量指向的对象的默认类型
问题描述
给定一个内存地址,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 的指针的强制转换违反了?这段代码是否由标准定义好(考虑到地址与结构大小对齐并且结构内没有填充)?
解决方案
整数常量指向的对象是否有默认类型
不——部分是因为整数常量不指向任何东西。
指针指向事物,指针有类型,当你有不同类型的指针指向同一个存储时,别名适用。
您在这里只显示一个类型的指针some_structure_type*
,因此该位置具有一个名称、一种类型且没有别名。地址也存储在一个int
(或intptr_t
其他)中的事实不会将另一种类型与它相关联。
您可以在此处阅读对严格别名要求的描述,但松散地说,当您通过不兼容类型的指针写入和读取同一地址时会出现实际问题,因为允许优化器假设您没有这样做.
这意味着即使您确实有另一个指向同一位置的不兼容类型的指针,除非您通过一个指针存储并通过另一个指针加载,否则它不会成为问题。char*
无论如何,整数常量或 a or都不是void*
“不兼容类型的指针”。
推荐阅读
- javascript - v-for 循环在运行后打印空行
- php - 从验证 MessageBag 中替换消息数组
- c# - How to update Enum value in ASP.NET Core MVC?
- ios - __OBJC2__ 在哪里?
- wordpress - 为类别的 woocommerce 单品添加自定义文本
- java - can you help me how to breakdown the denomination of my change? I've been searching everywhere how to do it but I still don't get it
- sqlite - SQ Lite 使用 LIKE 函数仅查找两个或三个单词
- r - 在 R 中读取 .dta 文件时出错
- c# - ECDH 与 HKDF 使用 c#
- apache-zookeeper - Solr 耗尽所有物理内存/磁盘缓存