C语言函数参数传递问题

前两天遇到一个很怪的问题,一个函数执行的结果不正确.使用gdb跟踪,发现调用函数时输入参数是a,进入函数执行体之后,参数值变成b了,象我这么有理性的人怎么会相信这么无稽的事呢?于是继续调试,汇编单步跟踪,发现传进函数的地址的确跟调用时的地址不一样,这可就怪了,超出能力之外,请教高人吧,折腾了半天终于发现了问题所在.

原来GCC的较新版本中使用了一个扩展语法,__attribute__((regparm(3),stdcall)),有这个声明的函数,该属性将使得GCC在编译该函数时,采用寄存器传参的方式,以提高函数压栈速度.无该声明的函数则使用x86默认的堆栈传参的方式.因为我的代码是从开源代码里kiang出来的,版本较老,没有这样的处理,所以就玩出毛病了.
后来在调用函数的文件中,增加一个extern声明,该问题就解决了.

其实还是因为很久没玩C了(一直在用java),所以一些基本的常识都没注意到,否则还是能避免花这些时间的

1.使用外部函数时,一定要加extern声明

2.要重视implicit declararion of funciton类的告警,它可能预示着程序运行的逻辑错误

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值