#define value1 *(int*)46
Run Code Online (Sandbox Code Playgroud)
我在头文件中遇到了类似的声明,用于微控制器的中断(寄存器)和外设的地址定义.
我怎么解释它?
我们通过对类型进行类型转换并使用*运算符从中提取值来使46成为指针类型.因此,位置46处的值必须存储在value1中.
怎么了?
printf("%d",&value1)
Run Code Online (Sandbox Code Playgroud)
这将x的地址返回为46.
printf("%d",value1)
Run Code Online (Sandbox Code Playgroud)
这会产生运行时错误.当我们尝试访问x的值时,也会产生运行时错误.
以下是我的问题:
究竟是什么*(int *)46意思?
什么是value1?整数指针或整数
关于这个或任何其他使用指针的方式的任何更多信息和额外评论对于像我这样的初学者是最受欢迎的.先感谢您.
bar*_*nos 10
有x = *(int*)46,你sizeof int从内存读取字节,从地址46开始.
使用*(int*)46 = x,您将sizeof int字节写入内存,从地址46开始.
当然,此操作之前应该正确分配该内存块.
请注意,根据您的平台(底层硬件架构+指定的编译器),不能保证实际操作确实从给定的内存地址开始.
更具体地说,如果地址未对齐int(不能被整除sizeof int)并且您的平台不支持未对齐的加载/存储操作,那么此类操作的结果将不是您所期望的.例如,您可能会收到"非法内存访问"异常,或者操作可能从距离最近的较小地址开始int.
我应该强调的是,如果int在此操作之前没有在该存储器地址中正确分配块,那么无论我之前提到的条件如何,C语言标准都不会定义此类操作的结果(具体值)的地址和使用平台的类型).
编辑:
好的,我忘记了我在这个网站上正在处理的人.
很快就会删除这个答案,以免与SO律师发生麻烦.
我下次会写UB,所以这里的每个人都会满意(实际的问题仍然没有答案)......
显式地将整数转换为指针,你的(int*)46部分是C标准所称的"实现定义",也就是说它取决于你的特定平台在这里发生了什么.如果您的平台定义46为有效地址,端口号或其他任何内容,那么*在前面取消引用它应该在该地址读取或写入.
如果您的平台不允许这样做,这可能会在执行时给您一个分段错误,即如果您在PC或类似设备上.这种平台可以保护您免受随机地址的攻击,保护您自己和其他人的安全.
如果你碰巧为一个更受限制的环境(例如嵌入式系统)编程,那么就没有这样的保护,而且事情可能会出错.因此,C标准要求从任何整数值到指针值进行显式转换(转换).通过这个你告诉编译器你知道你在做什么.
| 归档时间: |
|
| 查看次数: |
7681 次 |
| 最近记录: |