#define value1 *(int*)46
我在头文件中遇到了类似的语句,用于微控制器的中断(寄存器)和外围设备的地址定义。
我如何解释它?
我们通过对它进行类型转换并使用 \* 运算符从中提取值来使 46 成为指针类型。因此,位置 46 处的值必须存储在 value1 中。
怎么了?
printf("%d",&value1)
这会将 x 的地址返回为 46。
printf("%d",value1)
这会产生运行时错误。当我们尝试访问 x 的值时也会导致运行时错误。
以下是我的问题:
*(int *)46
究竟是什么意思?什么是价值 1?整数指针或整数
对于像我这样的初学者来说,非常欢迎关于这个或任何其他使用指针的方式的更多信息和额外评论。先感谢您。
原文由 kryptoknight 发布,翻译遵循 CC BY-SA 4.0 许可协议
使用
x = *(int*)46
,您正在从内存中读取sizeof int
字节,从地址 46 开始。使用
*(int*)46 = x
,您正在将sizeof int
字节写入内存,从地址 46 开始。当然,此操作之前应该正确分配该内存块。
请注意,根据您的平台(底层硬件架构+指定编译器),不能保证实际操作确实会从给定的内存地址开始。
更具体地说,如果地址未与
int
对齐(不能被sizeof int
整除)并且您的平台不支持未对齐的加载/存储操作,那么此类操作的结果将不会是你所期望的。例如,您可能会遇到“非法内存访问”异常,或者操作可能从与int
对齐的最近的较小地址开始。我可能应该强调的是,如果在此操作之前没有在该内存地址正确分配
int
块,那么 无论 我之前的条件如何,C 语言标准都未定义此类操作的结果’已经提到(地址的具体值和使用的平台类型)。编辑:
好的,我忘记了我在这个网站上与谁打交道。
将很快删除此答案,以免与 SO 律师发生麻烦。
下次我只会写UB,所以这里的每个人都会保持满意(实际问题将仍然没有答案)……