具体:
在文件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的栈帧破坏掉