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的栈帧破坏掉

你可能感兴趣的:(嵌入式交叉开发环境)