问题描述
问题非常奇怪,函数中定义了局部变量,在调用完第三方函数后(未使用此局部变量传参或指针),局部变量的值被置为0了。
gdb调试和打印日志发现,局部变量的地址被更改了!!!求大神指导。
问题出现的环境背景及自己尝试过哪些方法
gdb调试和打印日志,都可以发现是调用第三方函数后出现了这个问题。具体可以参考下面示例,实际函数内部很多个局部变量地址都被改变了,怀疑是某一块存储区域被改变了。
- 变量改为static后,可以解决问题,变量地址前后没有变化,值不变(不符合函数需求,实际没法这么干);
- 删除调用第三方函数代码,可以解决问题,变量地址前后没有变化,值不变;
- 操作系统:RedHat 7.4 x86_64
- gcc版本: 4.8.5 20150623
相关代码
业务代码比较复杂,以下是示意代码:
void f1()
{
short nTestId = 7;
打印变量地址和值:
printf("before: [%p][%d]", &nTestId, nTestId);
// 调用第三方函数
f2();
printf("after: [%p][%d]", &nTestId, nTestId);
}
某次运行的结果:
before: [0x7ffd522328ca][7]
after: [0x7ffd5223287a][0]
疑问
C程序中,有可能在应用层更改局部变量的地址吗?我理解程序启动时变量地址已经确定了,不可能再改变了吧。
上述问题可能是什么原因造成的?
内存越界,把堆栈写坏了。调用后栈顶指针变了。
局部变量地址不变的是相对于栈顶的偏移。