遇到局部变量被意外修改的问题,发现是编译器给2个局部变量分配了相同的地址?
本帖最后由 zhangzhonghua 于 2023-12-27 16:33 编辑遇到局部变量被意外修改的问题,仿真,单步跟踪,发现是编译器给2个具有调用关系的函数的2个局部变量分配了相同的地址,这怎么回事?
简化如下。
func1()
{
xInfo * p = ...; // 局部变量,指向某结构xInfo的指针,地址 0x0236
...
func2();
// 到这里,发现 地址 0x0236 的内容被修改
}
func2()
{
uchar sw; // 局部变量,地址居然也是 0x0236
sw = 0; // 这里,就会把func1的局部变量p给意外修改了
}
怎么会这样?!怎么办?
加个volatile关键字试试 可以搜索一下OVERLAY 功能 ,,,如果资源足够可以关闭这个功能,,或者有能力修改调用树, 还有一件事,,你应该不是这样调用的吧,,你的fun2 利用指针调用的么? 你可以在func1中的func2之前打印输出下*p的内容,在func2中再打印一下*p的内容,看看修没修改 可以在C251选项里选择产生可重入函数功能 加static啊 本帖最后由 杨为民 于 2023-12-27 00:56 编辑
(1)这种现象很正常,很正确,这是C51编译器优化变量存储。
(2)func2()是func1()的最后一行, 指针P再也不会被使用,覆盖它修改它没有关系。
(3)出现这种现象不用理它。C51是智能优化,如果你在func2()调用后又引用了P,C51自然又会为它们分配不同的地址,不会出错的。
(4)关闭C51优化就不会产生这种现象了。
杨为民 发表于 2023-12-27 00:54
(1)这种现象很正常,很正确,这是C51编译器优化变量存储。
(2)func2()是func1()的最后一行, 指针P再 ...
关于第3点,,就算p不再被调用 也应该分配不同地址,,,就像我说的,他的func2绝对不是这样正常的调用,,, 本帖最后由 zhangzhonghua 于 2023-12-27 09:54 编辑
_奶咖君_ 发表于 2023-12-27 09:06
关于第3点,,就算p不再被调用 也应该分配不同地址,,,就像我说的,他的func2绝对不是这样正常的调用, ...
高手,确实不是函数名调用,而是用函数指针调用。
*g_pFunc = func2; // 函数指针指向func2()
func1()
{
xInfo * pStruc = ...; // 局部变量,指向某结构xInfo的指针,地址 0x0236
...
g_pFunc(); // 相当于调用func2()
// 到这里,发现 地址 0x0236 的内容被修改
...
}
func2()
{
uchar sw; // 局部变量,地址居然也是 0x0236
sw = 0; // 这里,就会把func1的局部变量pStruc给意外修改了
}
但是,我的程序里面是要用函数指针的。怎么办?我看看Overlay怎么搞。