繁体   English   中英

C中程序堆栈的确切内容是什么?

[英]What are the exact contents of a program stack in C?

我想知道程序堆栈的确切内容。

分支操作如何完成?

使用gdb调试程序时的内存转储是什么意思?

它是否提供程序堆栈?

TIA,普拉文

C语言本身完全不要求使用堆栈-它定义行为而不是实现。

但是,在通常情况下,程序堆栈用于存储一些内容:

  • 具有auto存储持续时间声明的对象(即普通的非static局部变量);
  • 功能参数;
  • 返回地址(返回后应在代码中恢复执行的位置return;或到达当前函数的末尾);
  • 用非标准的alloca()函数分配的内存;
  • 编译器所需的临时值,例如寄存器的保存内容, alloca()内部alloca()信息,可变长度数组的大小以及计算中使用的中间值。

这不是一个详尽的列表-有时还会将其他更奇特的东西(例如蹦床)存储在堆栈中。 通常,它是用于工作项的临时存储区,在当前函数返回其调用方之后,将不需要该工作区。

调试器中的“回溯”显示了堆栈的某些(但不是全部)内容。

堆栈是一个存储区域,其中包含子例程参数,局部变量和子例程的返回地址。

在许多体系结构(包括Intel的体系结构)上,堆栈从上到下递增-意味着每次将数据推入堆栈时,堆栈指针都会减少。

典型的函数调用序列如下所示:

  • 推论据
  • 跳转到子例程(将返回地址推入堆栈)
  • 在某些语言中(例如,Pascal),基本指针被压入堆栈。
  • 所调用的子例程在堆栈中为其局部变量分配空间。

要生成堆栈跟踪,运行时环境只需扫描堆栈以确定返回地址指向的位置。 我写了“简单”的文章,但是如果没有将基本指针保存到堆栈中并不是那么简单,因为可能无法确定除当前指针以外的任何其他堆栈帧的位置。

请参阅下面的链接,它可以使您更好地了解变量和内存

它在内存损坏发生之前给出堆栈跟踪。该堆栈跟踪是与传递的参数一起进行的一系列函数调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM