栈内存学习

栈是一种数据结构,栈是一种思想(后进先出),栈应用于栈内存的分配。

那么数据是如何存入栈中的呢?

栈的存储方向是从高地址往低地址,栈底永远在栈的最高地址,栈顶随压栈、出栈动态移动,一直指向栈的最低地址。

程序的运行实际上是不断的(变量声明、参数传递、函数调用、值返回)的过程。这个过程实际上就是一个压栈的过程。

最先调用的函数内存地址是最高的,函数嵌套调用过程中,被调用函数内存地址逐级变小,每一级栈中的函数也叫栈帧。函数内部的局部变量也随之被压入栈中,第一级函数中的局部变量地址绝对比第二级函数中的局部变量地址大。

在8086CPU中,入栈时,栈顶从高地址向低地址方向增长。任意时刻,SS:SP指向栈顶元素。
当栈满的时候,再次使用push指令入栈,或占空的时候再使用pop指令出栈,都将发生栈顶越界问题。  

 

这里还有2个问题我还没想明白。

下面这个程序在网上找的,

1.   在linux环境下,运行结果是2,3,0,为什么不是22,0

2.   既然参数压栈是从右向左,为什么函数print中形参a,b,c的地址是由大到小?而声明的变量x,y,z的地址是由小到大?

#include <stdio.h>

void print(int a, int b, intc)

{

   Int x, y, z;

   printf("%d\t%d\t%d\n", a, b, c);

}

int main(void)

{

    int p = 0;

    print(p++, ++p, p++);

    return 0;

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值