标签:style blog http io color ar 使用 sp strong
问题一:如何判断内存中栈是向下生长的
试验代码如下:
1 #include <stdio.h> 2 3 void func(int x, int y, int z) 4 { 5 printf("func x is %d---%p\n", x, &x); 6 printf("func y is %d---%p\n", y, &y); 7 printf("func z is %d---%p\n", 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\n", &x); 18 printf("main y is ---%p\n", &y); 19 printf("mian z is ---%p\n", &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\n", max); 36 37 max = maxvalue(5, 21, 11, 73, -5, 99); 38 printf("max is ---%d\n", max); 39 40 return 0; 41 }
只有当栈是向下生长的时候,才会根据第一个参字符串数一次读取后面参数的值,因为C是支持可变长参数的。
编写支持可变长参数的函数时,可以使用库函数的宏,也可以不用。
标签:style blog http io color ar 使用 sp strong
原文地址:http://www.cnblogs.com/philospy/p/4093307.html