搜索
bottom↓
回复: 24

为什么有的函数传进参数以后会被无故改掉?

[复制链接]

出0入0汤圆

发表于 2018-1-3 22:11:35 | 显示全部楼层 |阅读模式
嗯,这是一段时间以前的事情了。

有个函数,里面又有个函数。

大概是这样:

func_1(u8 para1, u16* para2)
{
        return ERROR_CHECK_ROUTINE(library_func(para1, para2));
}

设置断电,在执行这一句的时候


func_1(index, p_dat);

p_dat 的值是对的,指向的地址也是没问题的

然后,嗯嗯、

按F11进入func_1内部,这时,奇迹发生了=。=

para2 应当指向p_dat 原先的地址,氮!素!

para2此时是个莫名其妙的地址,后面程序统统乱套


我把O3调成O0,问题依旧。


有没有高人知道是怎么回事啊,总是遇到这种
无语的事情T_T

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2018-1-3 22:12:27 | 显示全部楼层
如果是IAR  正常  IAR有警告的时候就可能出现这个问题

出0入0汤圆

 楼主| 发表于 2018-1-3 22:15:06 | 显示全部楼层
不是iar,keil。有很多警告但都是函数定义了但未使用。

出0入0汤圆

发表于 2018-1-3 22:30:07 来自手机 | 显示全部楼层
前排占座

出0入0汤圆

发表于 2018-1-3 23:46:15 | 显示全部楼层
检查你的堆栈大小,有没有溢出?

出0入362汤圆

发表于 2018-1-3 23:57:31 | 显示全部楼层
是在同一个文件里么?
如果不是,调用函数的文件前面有没有相应的#include?
没有原型的话, 可能会把所有参数都默认当作int

出0入0汤圆

 楼主| 发表于 2018-1-4 08:27:25 | 显示全部楼层
meirenai 发表于 2018-1-3 23:46
检查你的堆栈大小,有没有溢出?

那个、弱弱问下,在keil里面怎么
检查是否溢出?

堆栈我知道在.s文件里面看……

出130入20汤圆

发表于 2018-1-4 08:31:48 | 显示全部楼层
Keil编译器也经常遇到莫名其妙的问题,比如一些局部变量被篡改,改成全局就没事了。优化等级调低也不行。

出10入113汤圆

发表于 2018-1-4 08:46:30 | 显示全部楼层
一般都是地址空间重合了

出0入31汤圆

发表于 2018-1-4 08:47:00 来自手机 | 显示全部楼层
栈溢出啦

出110入170汤圆

发表于 2018-1-4 08:52:54 来自手机 | 显示全部楼层
有没有优化,有的时候优化会。

出0入0汤圆

发表于 2018-1-4 09:16:05 | 显示全部楼层
p_dat是全局、静态、局部变量?

出0入0汤圆

发表于 2018-1-4 09:16:49 | 显示全部楼层
栈溢出啦,问题不一定是这里本身的问题,检查一下其他地方有没有溢出。

出0入0汤圆

发表于 2018-1-4 09:23:47 | 显示全部楼层
看下汇编就知道了

出0入0汤圆

发表于 2018-1-4 09:25:10 | 显示全部楼层
对齐的问题吧.

出0入0汤圆

发表于 2018-1-4 09:47:35 | 显示全部楼层
两种检查:1.看看是不是栈溢出了。方法:实在不知道有没有溢出,那就试着把栈的大小增加0x100个字节,看看程序正常了没,正常了,基本就是栈溢出的原因了。
                2.你的指针参数para2,是全局变量还是局部变量,是局部变量的话,是定义并初始化了的还是说是其它函数的返回值,返回值形式的指针,最容易出问题,检查返回的是不是非静态局部变量。如果是的话,请再学一遍C。

出0入42汤圆

发表于 2018-1-4 14:00:55 | 显示全部楼层
C语言形参实参问题。p_dat做了参数后,它只能保证它指向的变量的地址不变,但是它对应的地址值不保证,你要想p_dat对应的地址不变,你要传二级指针。不知道是不是答非所问了。

出0入0汤圆

发表于 2018-1-4 14:16:49 | 显示全部楼层
liyang121316 发表于 2018-1-4 14:00
C语言形参实参问题。p_dat做了参数后,它只能保证它指向的变量的地址不变,但是它对应的地址值不保证,你要 ...

p_dat 本来就是一个地址,做参数的时候,只是一个拷贝,怎么可能改变?

出0入0汤圆

发表于 2018-1-4 14:21:36 | 显示全部楼层
IAR有时候很坑,以前碰到过全局的结构体变量被无缘无故占用了,结果要显示这个变量到屏幕它怎么都是零,也无法改变,最后改了一下变量名,就正常了

出0入0汤圆

发表于 2018-1-4 15:25:16 | 显示全部楼层
我刚遇到 数组使用超过了数组长度。导致后面来添加的几个变量。进入主循环就会清零。

出0入0汤圆

 楼主| 发表于 2018-1-5 08:17:58 | 显示全部楼层
额,

特地找功夫把程序又弄出来看了一下

稀里糊涂的把问题貌似解决了

似乎是被篡改的变量和某个库函数的
静态全局变量重名了

我把名字改了以后似乎就正常了~~

出0入0汤圆

发表于 2018-1-8 17:18:13 | 显示全部楼层
所以说楼主,命名规范还是很重要的

出0入0汤圆

发表于 2018-1-8 17:42:26 | 显示全部楼层
我记得LZ 之前帖子里说 工资已经有山那么高, 还做这种粗活啊

出0入0汤圆

发表于 2018-1-9 12:45:57 | 显示全部楼层
栈溢出了

出0入0汤圆

发表于 2018-1-9 14:57:19 | 显示全部楼层
习学发开 发表于 2018-1-5 08:17
额,

特地找功夫把程序又弄出来看了一下

静态全局变量?这有点说不通啊。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 19:08

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表