c语言函数实际参数,C语言:函数声明与定义的参数不一致问题,后果可能很严重哦!!!!!...

具体:

在文件main.c中

int func ();     //声明中没参数

int main(){

int c = func();            //调用时也不传参,这样才能编译通过

printf("%d\n",c);

return 0;

}

在文件func.c中

int func(int a, int b,int c, int d, int e, int f,int g,int h,int i,int j, int k,int l,int m,int n){

int aa = a;

int bb= b;

int cc =c;

int dd=d;

int ee =e;

int ff=f;

int gg =g;

int hh = h;

int ii = i;

int jj = j;

int kk =k;

int ll =l;

int mm =m;

int nn = n;

a = 0;

b = 0;

d=0;

e = 0;

f = 0;

g = 0;

h = 0;

i = 0;

j = 0;

k = 0;

l = 0;

m = 0;

n = 0;

return b;

}

执行结果

$ gcc main.c func.c

$ ./a.out

0

Segmentation fault

不要怀疑,这个程序可以编译,链接通过。

但是执行时出错,因为func的代码破坏了main的栈帧,导致“段错误”

有人说,C中参数个数有限制,但是毕竟编译通过了,说明语法没错,也就没有参数个数限制了

这只是个极端的例子,但是还是值得注意:当声明与定义的参数不一致时,有可能出错

1)若不定义aa,bb,cc.....这些局部变量,不把实参a,b,c......传给他们的话,程序不会出错

通过比较汇编代码,发现:

1)若没定义int aa = a;.....这些语句,则对实参a,b,c......赋值时,修改的是func()函数的栈帧

2)若有int aa = a;.....这些语句,则对实参a,b,c......赋值时,修改的是main()函数的栈帧  ,这样当然会把main的栈帧破坏掉

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值