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

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

试验代码如下:

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

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

时间: 2024-08-07 00:07:44

C的栈为什么是向下生长的???的相关文章

Java性能分析之线程栈详解(下)

Java性能分析之线程栈详解(下) 转载自:微信公众号"测试那点事儿" 结合jstack结果对线程状态详解 上篇文章详细介绍了线程栈的作用.状态.任何查看理解,本篇文章结合jstack工具来查看线程状态,并列出重点关注目标.Jstack是常用的排查工具,它能输出在某一个时间,Java进程中所有线程的状态,很多时候这些状态信息能给我们的排查工作带来有用的线索. Jstack的输出中,Java线程状态主要是以下几种: 1.BLOCKED 线程在等待monitor锁(synchronized

理解TCP/IP网络栈&amp;编写网络应用(下)

1.摘要 这是<翻译:理解TCP/IP网络栈&编写网络应用>的下篇,文章中会通过讲解TCP的代码实现帮助大家理解发送.接收数据的流程,也描述了一些网卡.驱动等网络栈底层的原理. 原文地址:原文地址 原作者:Hyeongyeop Kim 2.数据结构 以下是一些关键数据结构.我们了解一下这些数据结构再开始查看代码. 2.1.sk_buff_structure 首先,sk_buff结构或skb结构代表一个数据包.图6展现了sk_buff中的一些结构.随着功能变得更强大,它们也变得更复杂了.

JAVA虚拟机的生命周期

一个运行时的Java虚拟机实例的天职是:负责运行一个java程序.当启动一个Java程序时,一个虚拟机实例也就诞生了.当该程序关闭退出,这个虚拟机实例也就随之消亡.如果同一台计算机上同时运行三个Java程序,将得到三个Java虚拟机实例.每个Java程序都运行于它自己的Java虚拟机实例中. Java虚拟机实例通过调用某个初始类的main()方法来运行一个Java程序.而这个main()方法必须是共有的(public).静态的(static).返回值为void,并且接受一个字符串数组作为参数.任

[转]JAVA虚拟机的生命周期

JAVA虚拟机体系结构 JAVA虚拟机的生命周期 一个运行时的Java虚拟机实例的天职是:负责运行一个java程序.当启动一个Java程序时,一个虚拟机实例也就诞生了.当该程序关闭退出,这个虚拟机实例也就随之消亡.如果同一台计算机上同时运行三个Java程序,将得到三个Java虚拟机实例.每个Java程序都运行于它自己的Java虚拟机实例中. Java虚拟机实例通过调用某个初始类的main()方法来运行一个Java程序.而这个main()方法必须是共有的(public).静态的(static).返

程序的指令级表示(汇编)

程序的指令级表示(汇编) 预备知识1: 堆栈:先进后出,操作有push(),pop(),peek() 应用:函数调用 树的遍历(所有递归操作) 表达式的计算 预备知识2: 寄存器:CPU中临时存储数据的空间 小 快 贵 32位(0~31)EAX  以前8086是16位(0~15)AH,AL 通用寄存器 AX,BX,CX,DX:进行运算处理等 *函数调用的规则 寄存器ESI和EDI source和destination:copy数据 ***EBP:描述了一个栈帧(一个栈内元素),永远指向一个栈帧的

第4课-Linux应用程序地址布局

1.应用程序都是由代码段,数据段,BSS段以及堆空间,栈空间组成.2.布局方式:(1)代码段在最低地址处,一般都是从0x8048000开始,这是虚拟地址,每一个应用程序都是这样的(2)数据段紧贴着代码段(3)在往上是BSS段其实也是一种数据段(4)在往上是堆空间,堆空间是往上增长的(5)定不一般是栈空间,栈空间是向下生长2.查看各个段的地址(1)在应用程序里面,末尾处加上while循环,防止程序结束后我们都还来不及查看(2)编译成可执行程序并运行(3)用#ps aux命令查看你的应用程序的PID

java编程思想 第二章

这篇时间较之前篇章时间靠后,是由于,某一天晚上看完Java编程思想文献之后来不及做笔记了. 以下笔记基本为转载,不是原创 第二章   一切都是对象 目录: 2.1 用引用操纵对象 2.2 必须由你创建所有对象 2.3 永远不需要销毁对象 2.4 创建新的数据类型:类 2.5 方法.参数和返回值 2.6 构建一个Java程序 2.7 你的第一个Java程序 2.8 注释和嵌入式文档 2.9 编码风格 2.1 用引用操纵对象 一切都看作对象,操纵的标识符实际上是对象的一个“引用”,遥控器(引用)操纵

Linux 下函数栈帧分析

1.关于栈 对于程序,编译器会对其分配一段内存,在逻辑上可以分为代码段,数据段,堆,栈 代码段:保存程序文本,指令指针EIP就是指向代码段,可读可执行不可写 数据段:保存初始化的全局变量和静态变量,可读可写不可执行 BSS:未初始化的全局变量和静态变量 堆(Heap):动态分配内存,向地址增大的方向增长,可读可写可执行 栈(Stack):存放局部变量,函数参数,当前状态,函数调用信息等,向地址减小的方向增长,非常非常重要,可读可写可执行.如下图所示: 首先必须明确一点也是非常重要的一点,栈是向下

JVM学习(2)——技术文章里常说的堆,栈,堆栈到底是什么,从os的角度总结--转载http://www.cnblogs.com/kubixuesheng/p/5202561.html

转载自---http://www.cnblogs.com/kubixuesheng/p/5202561.html 俗话说,自己写的代码,6个月后也是别人的代码--复习!复习!复习!涉及到的知识点总结如下: 堆栈是栈 JVM栈和本地方法栈划分 Java中的堆,栈和c/c++中的堆,栈 数据结构层面的堆,栈 os层面的堆,栈 JVM的堆,栈和os如何对应 为啥方法的调用需要栈 属于月经问题了,正好碰上有人问我这类比较基础的知识,无奈我自觉回答不是有效果,现在深入浅出的总结下: 前一篇文章总结了:JV