社区
C语言
帖子详情
c中全局变量的值无缘无故被改变了
跑步_跑步
2013-05-09 11:34:47
我有一个全局变量int IDIndex[32],其中两个赋过一次值IDIndex[0]=1,IDIndex[1]=2,第一次打印出IDIndex[0]=1,IDIndex[1]=2,第二次打印就变成IDIndex[0]=808333373,IDIndex[1]=808464432,这是什么原因呢?
...全文
4793
26
打赏
收藏
c中全局变量的值无缘无故被改变了
我有一个全局变量int IDIndex[32],其中两个赋过一次值IDIndex[0]=1,IDIndex[1]=2,第一次打印出IDIndex[0]=1,IDIndex[1]=2,第二次打印就变成IDIndex[0]=808333373,IDIndex[1]=808464432,这是什么原因呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
26 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
banks0913
2013-05-28
打赏
举报
回复
2
这个我也遇到过,仔细检查这个函数中其他的变量,是否对其中某个变量或者buff拷贝数据越界,导致你这个变量的内容被覆盖掉了.
绯红女王
2013-05-24
打赏
举报
回复
试试设置静态的····
袁保康
2013-05-24
打赏
举报
回复
1
先这个const int IDIndex[32]; 看是不是你自己改了。 再按照如果编译能过说明,你没有改。就按照赵老师的方法,设置条件断点。
赵4老师
2013-05-24
打赏
举报
回复
To set a breakpoint when a variable changes value 1. From the Edit menu, click Breakpoints. 2. Click the Data tab of the Breakpoints dialog box. 3. In the Expression text box, type the name of the variable. 4. Click OK to set the breakpoint.
金刚葫芦娃
2013-05-24
打赏
举报
回复
数组越界了..
乀Lan
2013-05-24
打赏
举报
回复
用volatile修饰试试呢,.
跑步_跑步
2013-05-20
打赏
举报
回复
1、调用IDIndex的流程大概是这样的:这个全局变量IDIndex[]是定义在一个非主程序文件file.c中的,主程序执行一个新线程new_thread,new_thread调用file.c中的一个方法,给IDIndex赋值,之后不再执行这个file.c文件的任何方法。然后该线程在另一个can.c文件中调用IDIndex的值。 2、当主线程同时要处理大量socket数据的时候,new_thread线程调用IDIndex,这时这个数组的值就变成了类似地址的值(也许就是地址值);如果屏蔽掉主线程的socket数据,new_thread线程调用IDIndex没有任何问题; 3、但是,当我把这个全局变量IDIndex[]定义到主程序文件main.c中时,无论主线程是否处理socket数据,new_thread线程调用IDIndex都不会有任何问题。 这种现象不知道是怎么造成的,难道是新线程中定义的全局变量作用时间比较短吗?容易被别的文件改变值? ps:不知道我表达的清楚不,望各位看官谅解吧。。。
zhaozilan_ly
2013-05-15
打赏
举报
回复
1
引用 1 楼 chuachua66 的回复:
越界,仔细查代码吧。
lstok2009
2013-05-14
打赏
举报
回复
b 【function】 if IDIndex[0]=808333373 ?
折翼断JJ
2013-05-13
打赏
举报
回复
声明为const。
wizard_tiger
2013-05-13
打赏
举报
回复
设断点调试吧!
startservice
2013-05-13
打赏
举报
回复
设个数据断点可以
lm_whales
2013-05-13
打赏
举报
回复
其他代码修改了全局变量,可能是代码修改的,也可能是程序出错修改了数值, 如果是前者,直接检查代码,如果是后者,查查越界访问,和堆栈,堆有没有出错。
hugett
2013-05-09
打赏
举报
回复
这样很难看出问题的。。你可以自己设几个断点调试一下。。
跑步_跑步
2013-05-09
打赏
举报
回复
引用 3 楼 N_sev7 的回复:
上代码~~~~~~~~
代码比较长,而且调用的地方比较多,不好贴出完整的。但是很确定是在一个文件中赋值一次后,在另一个文件中反复调用 在file.c文件中定义的,在这个文件中赋值 for(r=0;r<AllParanum;r++) { IDIndex[r]=id_index[r]; printf("IDIndex[%d]=%d\n",r,IDIndex[r]); } 然后再canrecycle.c文件中反复调用 printf("*********IDIndex[0]=%d,IDIndex[1]=%d,IDIndex[2]=%d\n",IDIndex[0],IDIndex[1],IDIndex[2]); 在调用的过程中有执行其他函数,有局部变量的生成与销毁
N_Sev7
2013-05-09
打赏
举报
回复
上代码~~~~~~~~
starytx
2013-05-09
打赏
举报
回复
贴点代码看看
chuachua66
2013-05-09
打赏
举报
回复
2
越界,仔细查代码吧。
sophy520eangel
2013-05-09
打赏
举报
回复
话说这点代码真的看不出来问题 id_index[X] 给你的全局变量赋值了,如果只有这一处更改变量值得话,可以直接debug跟踪下id_index
ForestDB
2013-05-09
打赏
举报
回复
设write断点。
加载更多回复(5)
C语言
全局变量
被莫名修改,在
中
断程序里修改
全局变量
的童鞋注意啦-C
中
的volatile作用...
一个定义为volatile的变量是说这变量可能会被意想不到地
改变
,这样,编译器就不会去假设这个变量的
值
了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的
值
,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:1). 并行设备的硬件寄存器(如:状态寄存器)2). 一个
中
断服务子程序
中
会访问到的非自动变量(Non-automatic variables)3)....
C++
全局变量
值
被修改
一个
全局变量
的
值
在执行某个函数是被莫名修改了。为验证
全局变量
的改动情况,写了一部分代码用于测试
单片机C语言开发,
全局变量
或静态变量被意外改写
最终找到原因,工程默认的栈大小设置的不合适。具体原因是demo大量使用结构体,栈的开销巨大,某个结构体的变量地址和该静态变量地址是冲突的。当栈大小设置成较大的
值
后,就不会出现地址冲突的情况。最近用单片机移植一个hdmi芯片的配置程序,将demo移植到工程
中
后,debug发现有个静态变量的
值
被意外
改变
,偶尔会程序没有根据程序设计意图而变化的
值
。我用的单片机是GD32f303VET6,原STACK设置的大小是0x200,修改成0x1400后正常。
全局变量
被异常修改问题解决思路
系统函数(strcpy, strcmp...)导致越界,将这些不安全的函数暂时屏蔽或者使用带限制的函数(strncpy, strncmp...)等替换进行验证是否解决。数据/指针越界,这种时候需要查看map文件,查看被修改
全局变量
的附近是否有频繁修改的数据或者指针,尝试将附近的数据增大,查看是否解决问题。栈溢出,通过将栈空间增大或者将原来由栈分配的大数据改为全局数据,这样进行验证是否解决。
中
断
中
修改,操作时可通过开关
中
断来进行临界保护,验证是否能解决。多线程抢占,可通过加锁来验证是否为此原因导致。
STM32 Keil静态
全局变量
值
被修改
基于freertos进行开发: 1、在a.c文件
中
定义了char类型静态变量s_chA[8],在b.c文件
中
定义了int类型静态变量s_intB; 2、定义函数int GpioGet(unsigned int id, unsigned int*value); 3、在任务taskA
中
,通过GpioGet函数循环查询对应的GPIO电平状态, GpioGet(0, &s_chA[0]); GpioGet(1, &s_chA[1]); ...
C语言
70,005
社区成员
243,256
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章