CentOS64, 一个函数内static指针的值竟然不知怎么就变了——已解决,来接分了

leinchu 2018-07-07 12:01:12
这个静态变量这样声明的:
#ifdef ARRAY_DEBUG
static char protect0[1024]={0};
static ARRAY* in_desk_offline_users_str=NULL;
static char protect1[1024]={0};

if(in_desk_offline_users_str==NULL){
in_desk_offline_users_str = in_desk_offline_users;
getTimeStr(tstr1);
LOG_ERROR("now %s, %p(%p) vs %p(%p), sign=%s, sign1=%s",
tstr1, in_desk_offline_users_str, &in_desk_offline_users_str,
in_desk_offline_users, &in_desk_offline_users,
in_desk_offline_users->sign, in_desk_offline_users_str->sign
);
}else if(in_desk_offline_users_str != in_desk_offline_users){
int i;
char *cc = (char*) in_desk_offline_users;

getTimeStr(tstr);
LOG_ERROR("now %s, from %p(%p) to %p[addr=%p]", tstr, in_desk_offline_users_str, &in_desk_offline_users_str, in_desk_offline_users, &in_desk_offline_users);
LOG_ERROR("in_desk_offline_users_str=%p, sign=%s", in_desk_offline_users_str, in_desk_offline_users_str->sign);

exit(111);
}


在2018-07-06 16:43:52 它的值是: 0x4f3a5a0 (0x633d98=&in_desk_offline_users_str)

在2018-07-06 21:25:19 它的变为: 0x1290b780 (0x633d98) &in_desk_offline_users_str没变,还是:0x633d98

然后0x1290b780是另外一个线程在 2018-07-06 16:46:37 malloc的, size=512 alloc buy getFreeUser:79。
---------------------------------
以前是in_desk_offline_users这个报错,所以我才加了静态的来帮助发现in_desk_offline_users变化,结果现在in_desk_offline_users没变,反而静态变量变了。


这完全莫名奇妙,线程不同、时间相差很远!

求指导!!!



...全文
180 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
老马何以识途 2018-07-10
  • 打赏
  • 举报
回复
自己找出問題,成就感滿滿的。
赵4老师 2018-07-10
  • 打赏
  • 举报
回复
学会使用数据断点:
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]

srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
b[(a=rand()%11)]=0;
Sleep(100);
b[(a=rand()%11)]=1;
Sleep(100);
b[(a=rand()%11)]=2;
Sleep(100);
b[(a=rand()%11)]=3;
Sleep(100);
b[(a=rand()%11)]=4;
Sleep(100);
}
return 0;
}




GDB有watch命令
xian_wwq 2018-07-10
  • 打赏
  • 举报
回复
来接分,
越界操作危害大呀
leinchu 2018-07-10
  • 打赏
  • 举报
回复
这个问题就是数组越界的原因,有段代码使用一个数组,数组的索引越来越大,慢慢的就覆盖了它后面的内容,导致它后面的内容被覆盖成了相应的值。
用objdump -x 查找被修改的变量前面的变量,再看检查操作那些变量的代码有没有问题

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧