C的栈为什么是向下生长的???

问题一:如何判断内存中栈是向下生长的

试验代码如下:

 1 #include <stdio.h>
 2 
 3 void func(int x, int y, int z)
 4 {
 5     printf("func x is %d---%p
", x, &x);
 6     printf("func y is %d---%p
", y, &y);
 7     printf("func z is %d---%p
", z, &z);
 8 }
 9 
10 int main(void)
11 {
12     int x = 100;
13     int y = 200;
14     int z = 300;
15 
16     func(x, y, z);
17     printf("main x is ---%p
", &x);
18     printf("main y is ---%p
", &y);
19     printf("mian z is ---%p
", &z);
20 
21     return 0;
22 }

上述代码在VC++6.0上执行结果如下:

可以看出在

1)在函数内部定义的局部变量是按定义变量的先后顺序入栈的;

2)函数参数是从后往前入栈的;   

问题二:为什么函数参数的入栈顺序是从后往前???

答案是:C为了支持可变长参数.

实验代码如下:

 1 #include <stdio.h>
 2 #include <stdarg.h>
 3 
 4 int maxvalue(int n, ...)
 5 {
 6     int tmp = 0;
 7     int max = 0;
 8     int i   = 0;
 9 
10     /*定义一个指针*/
11     va_list paras; //char *paras;
12     
13     /*  根据字符串参数使指针指向第二个参数(实际的第一个参数) */
14     va_start(paras, n);
15     //paras = (char *)&n + sizeof(n); 
16 
17     while(n-- > 0)
18     {
19         /*读取向参数的值并使指针指向下一个参数*/
20         tmp = va_arg(paras, int);
21         //tmp = *(int *)(paras + (i++)*sizeof(n));  
22         max = (max > tmp) ? max:tmp;
23     }
24     /*给指针清零,防止野指针*/
25     va_end(paras);
26     //paras = NULL;
27     return max;
28 }
29 
30 int main(void)
31 {
32     int max = 0;
33 
34     max = maxvalue(3, -21, 11, -73);
35     printf("max is ---%d
", max);
36 
37     max = maxvalue(5, 21, 11, 73, -5, 99);
38     printf("max is ---%d
", max);
39 
40     return 0;
41 }

只有当栈是向下生长的时候,才会根据第一个参字符串数一次读取后面参数的值,因为C是支持可变长参数的。

编写支持可变长参数的函数时,可以使用库函数的宏,也可以不用。

  

原文地址:https://www.cnblogs.com/philospy/p/4093307.html