在我使用Compiler的STM8 Disco板上,我尝试了如下代码,并期望'ptr_a‘和'ptr_aLocal’是相同的:
int a, b, *ptr_a, *ptr_b;
void main()
{
int *ptr_aLocal;
a = 4;
b = 5;
ptr_a = &a;
ptr_b = &b;
ptr_aLocal = &a;
}然而,“ptr_a”变量“a”的地址是正确的,而“ptr_aLocal”包含错误的附加项。
使用gcc编译相同的代码时,'ptr_a‘和'ptr_aLocal’是相同的。
在主文件中声明指针本地时,这里的问题是什么?
谢谢你的帮助。拉斐尔
编辑:
现在我真的很困惑:当在代码末尾添加'ptr_b = ptr_aLocal;‘行时,ptr_b显示变量'a’(0x106)的正确入口,尽管'ptr_aLocal‘仍然包含变量a (0x108)的错误入口。
发布于 2020-10-27 14:12:41
各种早期版本的misc编译器倾向于对代码进行某种程度的优化,即使假设优化被禁用时也是如此。尤其是宇宙和代码战士在老版本中有这样的怪癖。由于不使用局部变量,所以对其进行了优化。
通过查看生成的汇编程序,您可以看到这一点--任何半体面的调试器都将支持程序组装步骤调试。如果没有堆栈推送或索引寄存器存储指令,则对其进行优化。
您可以强迫变量与volatile int *ptr_aLocal一起使用。
与您的问题无关,在编写8位微控制器时,您应该尽可能使用uint8_t而不是int。
https://stackoverflow.com/questions/64554859
复制相似问题