[英]What are the exact contents of a program stack in C?
我想知道程序堆栈的确切内容。
分支操作如何完成?
使用gdb调试程序时的内存转储是什么意思?
它是否提供程序堆栈?
TIA,普拉文
C语言本身完全不要求使用堆栈-它定义行为而不是实现。
但是,在通常情况下,程序堆栈用于存储一些内容:
auto
存储持续时间声明的对象(即普通的非static
局部变量); return;
或到达当前函数的末尾); alloca()
函数分配的内存; alloca()
内部alloca()
信息,可变长度数组的大小以及计算中使用的中间值。 这不是一个详尽的列表-有时还会将其他更奇特的东西(例如蹦床)存储在堆栈中。 通常,它是用于工作项的临时存储区,在当前函数返回其调用方之后,将不需要该工作区。
调试器中的“回溯”显示了堆栈的某些(但不是全部)内容。
堆栈是一个存储区域,其中包含子例程参数,局部变量和子例程的返回地址。
在许多体系结构(包括Intel的体系结构)上,堆栈从上到下递增-意味着每次将数据推入堆栈时,堆栈指针都会减少。
典型的函数调用序列如下所示:
要生成堆栈跟踪,运行时环境只需扫描堆栈以确定返回地址指向的位置。 我写了“简单”的文章,但是如果没有将基本指针保存到堆栈中并不是那么简单,因为可能无法确定除当前指针以外的任何其他堆栈帧的位置。
请参阅下面的链接,它可以使您更好地了解变量和内存
它在内存损坏发生之前给出堆栈跟踪。该堆栈跟踪是与传递的参数一起进行的一系列函数调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.