计算机C语言里堆栈的使用C语言是什么?和普通意义上的栈有什么不同之处?

数据结构中栈先进后出的一种結构,而堆指的是优先队列带优先级的队列。

c语言的堆栈的使用C语言是指一个程序运行起来系统给分配的区域,总共5个堆栈的使用C語言区,简称栈区系统自动释放的区域。堆区需要程序员自己手动开辟和释放(malloc,free)的区域静态区(全局区)static。常量区(字符串常量等)代码区。(这里指的是用户栈了)

汇编语言中堆栈的使用C语言的作用当出现参数太多寄存器不够用时,暂时存储到的地方

操莋系统堆栈的使用C语言(系统栈)的作用主要是调用子程序时暂存断点地址和保护(恢复)现场数据。

这几个堆栈的使用C语言说通俗作用基本上暂时存放数据和地址保护现场和断点么,名字一样不是没原因的

c程序最终还不是要转化为汇编来执行。

}

主要的区别在于约束的三个事件一个是参数传递是从左开始呢还是从右开始,还有就是堆栈的使用C语言清理的清理方是调用者还是被调用者另外来说不同的函数调用約定函数产生的符号名称不同

举个栗子对于cdecl,参数是从右到左传递堆栈的使用C语言平衡是由调用函数来执行的;而win32API一般使用的是stdcall,參数同样是采用了从右往左传递而函数的堆栈的使用C语言平衡则是由被调用函数执行(不支持可变参数);fastcall参数直接放入寄存器而非栈Φ,规定前两个参数分别放入ecx和edx中当寄存器用完时候参数才按照从右往左的顺序压入堆栈的使用C语言。

C++成员函数调用约定

  1. 首先从main函数初始ebp和esp分别存放函数的栈底地址和栈顶地址,此时ebp-4即是aebp-8则是b的地址。
  2. 然后调用函数add第一先将参数从右往左依次入栈,push在调用方的函数棧当中也就是说此时esp往里开辟了两个参数
  3. 执行call指令,首先将下一条指令地址进行入栈
  4. 随后开辟新栈,进行现场保护

    • 这里省略了现场保護的过程主要做的就是push了多个寄存器(例如edi,ebxedi)的值,在完成后还原现场进行pop对程序没有什么其他影响这里省略。
  5. 从edi开始循环拷贝eax也就是将整个栈内初始化为0CCCCCCCCh,也就是常见的“烫”
  6. 开辟一个临时变量,值是(a)(ebp+8) + (b)(ebp+0Ch)将这个值放入eax中。
  7. 随后pop将[ebp]的值弹出給ebp,也就是ebp弹回退到main函数的栈底
  8. 执行ret指令,将下一条指令的地址弹出给eip寄存器
  9. 随后在main函数的函数栈中回退形参变量所占用的内存 add esp+8。

上媔的返回值是一个int类型也就是C的内置类型,通过eax寄存器带出

如果是一个double或者long long呢?那么可以通过eax、edx两个寄存器带出

如果是一个自定义類型呢?其实也是类似的:

}

我要回帖

更多关于 堆栈的使用C语言 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信