对于C/C++程序员来说,这意味着什么?了解它有多重要?

至少在概念上,所有平台都是一样的吗?

我把它理解为函数用来存储局部变量的已分配内存的挡路……

我想知道更多

推荐答案

激活记录是堆栈帧的另一个名称.它是构成调用堆栈的数据 struct .它通常由以下部分组成:

  • 被呼叫人的本地人
  • 将地址返回给呼叫者
  • 被叫方的参数
  • 上一个堆栈指针(SP)值

因此,调用堆栈由任意数量的激活记录组成,这些记录在添加新的子 routine 时被添加到堆栈中,并在它们返回时从堆栈中移除(通常).

元素的实际 struct 和顺序是由平台甚至实现定义的.

对于C/C++程序员来说,general knowledge个这样的 struct 有助于理解某些实现功能,如调用约定,甚至为什么缓冲区溢出允许运行第三方恶意代码.

更多的intimate knowledge将进一步推进上述概念,并且即使在没有调试器或调试符号的情况下,也允许程序员调试他们的应用程序和读取存储器转储.

不过,更广泛地说,C/C++程序员可以在其业余编程生涯的很大一部分时间里,甚至不考虑调用堆栈.

C++相关问答推荐

如何将匿名VLA分配给指针?

为什么可以通过指向常量int的指针间接地改变整数的值?

如何将已分配的数组(运行时已知的大小)放入 struct 中?

Malloc(sizeof(char[Length]))是否不正确?

自定义应用程序上的日志(log)轮换问题

如何将字符串argv[]赋给C中的整型数组?

C在声明带有值的数组时,声明大小有用吗?

Clang警告称,`ffi_type`与`sizeof`不兼容

加密解密工作正常,但返回错误0x80090005

链接到底是如何工作的,我在这里到底做错了什么

C整型和_泛型.哪些类型是兼容的?

C堆栈(使用动态数组)realloc内存泄漏问题

如何在C宏定义中包含双引号?

发送和接收的消息中的Unix域套接字不匹配

我正在使用c学习数据 struct ,在学习堆栈时,我试图将中缀转换为后缀,并编写了这段代码.代码未给出输出

哪些C++功能可以在外部C块中使用

GCC认为这是一个VLA是对的吗?

这些表达式是否涉及 C 中定义的复合文字?

从管道读取数据时丢失

C99 的 %zu 格式说明符不起作用