zoukankan      html  css  js  c++  java
  • 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是支持可变长参数的。

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

      

  • 相关阅读:
    python web 开发中的csrf_token问题及处理方法
    开源编辑器ueditor
    表格中的文字超出长度隐藏,显示省略号
    django前端渲染多对多关系(比如一本书的作者有哪些)
    轻量级分布式 RPC 框架
    大杀器TheFatRat
    WEB扫描器Atscan的安装和使用
    Python类(二)-类的继承
    南京邮电大学网络攻防平台WEB题
    PHP文件操作(三)-文件的写入
  • 原文地址:https://www.cnblogs.com/philospy/p/4093307.html
Copyright © 2011-2022 走看看