• 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是支持可变长参数的。

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

      

  • 相关阅读:
    php面向对象三大特性
    php面向对象的重写与重载
    一组成对的数字,找出不成对的数字
    如何创建dll以及使用
    常见运行时错误
    连续数的和
    绕圆圈取球
    第一章 概述
    错误2038
    一个简单的环境光shader
  • 原文地址:https://www.cnblogs.com/philospy/p/4093307.html
Copyright © 2020-2023  润新知