Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >c++读取以前的函数堆栈帧

c++读取以前的函数堆栈帧
EN

Stack Overflow用户
提问于 2015-12-22 18:37:40
回答 2查看 273关注 0票数 2

我有一个由函数(名为write)创建的数组。在该函数返回后,我调用另一个函数(名为read),它直接从堆栈中读取相同大小的数组。

代码语言:javascript
运行
AI代码解释
复制
#include <iostream>
using std::cout;
using std::endl;

void write();
void read();

int main(void)
{
    write();
    read();

    return 0;
}

// Write an array of 10 ints to the stack
void write() {
    int array[10];
    for(int i = 0; i < 10; i++)
        array[i] = i;
}

// Read an array of 10 from stack
void read() {
    int array[10];
    for(int i = 0; i < 10; i++)
        cout << array[i] << endl;
}

读取函数不应该从堆栈读取相同的数组内容吗?

我发现有趣的是,第一个和第二个数组值总是相同的。第一个(在索引0处)是一个负垃圾值。第二个(在索引1处)是0。

据我所知,当函数返回时,它不会清理它的堆栈框架。因此,当read读取堆栈时,它读取的值与写的值相同。但是为什么第一个和第二个值总是这样?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-22 18:45:58

正如其他人所指出的,这种行为是完全没有定义的,所以即使您运行此代码1000次并看到此行为,您也可能在第1001次看到一些不同的情况。此外,您所看到的以及为什么将非常依赖于实现。如果您真的对更好地理解这一点感到好奇,我建议您查看编译器生成的汇编代码,这样您就可以更好地了解堆栈的运行情况。同样,您将如何实现依赖于实现,但是使用gcc,您可以将--save-temps选项传递给编译器,它会将它的中间文件提供给您阅读。这是很有教育意义的!

票数 2
EN

Stack Overflow用户

发布于 2015-12-22 18:45:27

数组在堆栈空间中占据相同的一般范围,但这只是巧合。如果读()或写()中有更多的变量,那么情况就不再是这样了。堆栈帧的结构是编译器中的一个实现细节--它取决于许多事情,比如函数中的变量、优化级别、编译器可能在堆栈上分配的临时存储空间、为函数或其调用程序可能抛出的异常释放数据.总之,永远不要依赖它。

从C++标准的角度来看,读取未初始化的变量(如read中的array )是一种未定义的行为--从获取虚假值到程序崩溃,任何事情都可能发生。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34427775

复制
相关文章
C/CPP函数括号{} | 栈帧 | 堆栈 | 栈变量
由上可见{}在汇编指令中发挥的作用可不少,函数之间的随意调用和顺利收场都离不开它们。
CtrlX
2022/10/04
7450
C/CPP函数括号{} | 栈帧 | 堆栈 | 栈变量
DS堆栈--行编辑 C++
使用C++的STL堆栈对象,编写程序实现行编辑功能。行编辑功能是:当输入#字符,则执行退格操作;如果无字符可退就不操作,不会报错
叶茂林
2023/07/30
2430
C/CPP函数调用的原理 | 函数指针 | 堆栈隐患
函数调用完成后返回到哪里了呢?当用IDE查看函数调用栈的时候,IDE是如何回溯出函数调用轨迹的呢?
CtrlX
2022/10/04
9600
C/CPP函数调用的原理 | 函数指针 | 堆栈隐患
函数调用时堆栈的变化情况
函数的正常运行必然要利用堆栈,至少,函数的返回地址是保存在堆栈上的。函数一般要利用参数,而且内部也会用到局部变量,在对表达式进行求值时,编译器还会生成一些无名临时对象,这些对象都是存放在堆栈上的。
恋喵大鲤鱼
2018/08/03
7990
函数调用时堆栈的变化情况
DS堆栈--括号匹配 C++
处理表达式过程中需要对括号匹配进行检验,括号匹配包括三种:“(”和“)”,“[”和“]”,“{”和“}”。例如表达式中包含括号如下:
叶茂林
2023/07/30
2660
使用C++中的cin函数来读取用户的输入
在C++中,cin是一个头文件iostream中的标准输入流,它用于从键盘读取输入。cin函数可以读取多种类型的数据,包括基本数据类型(如int、float、double)和字符串类型,其功能十分强大。使用cin函数读取用户输入可以让程序更加灵活、交互性更强。
很酷的站长
2023/08/25
1.7K0
使用C++中的cin函数来读取用户的输入
函数栈帧的创建与销毁
最近在学习C语言的过程中遇到了一些问题,在询问老师和查询相关资料的基础上了解到了函数栈帧的相关概念,对下列问题也有了答案。
摘星
2023/04/28
5830
函数栈帧的创建与销毁
汇编角度看函数堆栈调用
带着以下一个问题来探索: (1)形参的内存空间的开辟和清理是由调用方还是由被调用方执行的? (2)主函数调用函数结束后,主函数从哪里开始执行?从头开始还是从调用之后开始? (3)返回值是如何带出来的?
lexingsen
2022/02/24
7040
汇编角度看函数堆栈调用
函数栈帧的创建和销毁
函数栈帧( stack frame )就是函数调用过程中在程序的调用栈( call stack )所开辟的空间,这些空间是用来存放:
xxxflower
2023/04/16
9310
函数栈帧的创建和销毁
[C语言]函数栈帧的创建和销毁
返回值并不会随着函数作用域的销毁而销毁,而是放在eax中准备返回,当通过pop出栈回到main函数中再将返回值放到局部变量中。
IT编程爱好者
2023/04/12
5850
[C语言]函数栈帧的创建和销毁
C语言 | C++ 堆栈工作机制
我们经常会讨论这样的问题:什么时候数据存储在堆栈 (Stack) 中,什么时候数据存储在堆 (Heap) 中。我们知道,局部变量是存储在堆栈中的;debug 时,查看堆栈可以知道函数的调用顺序;函数调用时传递参数,事实上是把参数压入堆栈,听起来,堆栈象一个大杂烩。那么,堆栈 (Stack) 到底是如何工作的呢?本文将详解 C/C++ 堆栈的工作机制。阅读时请注意以下几点:
小林C语言
2020/12/25
7.8K0
C语言 | C++ 堆栈工作机制
堆栈操作合法性 C++
假设以S和X分别表示入栈和出栈操作。如果根据一个仅由S和X构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该序列是合法的堆栈操作序列。请编写程序,输入S和X序列,判断该序列是否合法。
叶茂林
2023/07/30
2410
函数栈帧的创建和销毁
        ①函数参数和函数返回值    ②临时变量(包括函数的非静态的局部变量以及编译器自动生产的其他临时变量)   ③保持上下文信息(包括在函数调用前后需要保持不变的寄存器)
二肥是只大懒蓝猫
2023/03/28
8250
函数栈帧的创建和销毁
C语言函数的栈帧详解
一个限定表尾进行删除(出栈)和插入(入栈)操作的线性表,其过程类似与压子弹与退子弹(后进先出)。 一个由系统自动分配的内存空间,譬如调用函数、创建临时变量时内存空间的创建与销毁。 用于存储函数内部的局部变量、方法调用、函数传参数值等。 由高地址向低地址生长。
CtrlX
2022/10/27
2.3K0
C语言函数的栈帧详解
C++ fscanf函数分割读取文本文件
C 库函数 int fscanf(FILE *stream, const char *format, ...) 从流 stream 读取格式化输入,头文件是<stdio.h>,  fscanf遇到空格和换行时结束。
用户7886150
2021/02/12
2K0
windows平台调用函数堆栈的追踪方法
在windows平台,有一个简单的方法来追踪调用函数的堆栈,就是利用函数CaptureStackBackTrace,但是这个函数不能得到具体调用函数的名称,只能得到地址,当然我们可以通过反汇编的方式通过地址得到函数的名称,以及具体调用的反汇编代码,但是对于有的时候我们需要直接得到函数的名称,这个时候据不能使用这个方法,对于这种需求我们可以使用函数:SymInitialize、StackWalk、SymGetSymFromAddr、SymGetLineFromAddr、SymCleanup。
Masimaro
2018/08/31
3.3K0
C++|Compiler|活动记录(栈帧)
活动记录(Activation Record),常称栈帧(stack frame)。需要注意的是,在支持闭包的语言中,活动记录未必在栈上,因为函数返回仍需访问其中的变量,因此活动记录应作为环境保存下来。
朝闻君
2021/11/22
1.3K0
C++|Compiler|活动记录(栈帧)
限制堆栈的堆栈排序
原文题目:Stack sorting with restricted stacks
Jarvis Cocker
2019/07/19
1.3K0
函数调用堆栈图-c语言
中间的一小段没有意义的汇编语言是为了方便设置断点,为后面的调试做好铺垫,因为有时会碰到找不到断点位置的情况,使用这个方法,可以在找不到断点的时候向后执行一次,而不破坏我们想调试的程序当前的堆栈状态,这里对main函数和sum函数的效果是类似的,这里直接跟着断点来执行分析sum函数的堆栈操作。
信安本原
2020/03/08
2.8K0
汇编学习(5),函数,栈帧
这儿又出现了一个leave指令,leave就等同于 mov rsp,rbp,pop rbp。
一只小虾米
2022/12/07
5050
汇编学习(5),函数,栈帧

相似问题

高阶函数和帧堆栈

131

C++禁用堆栈帧下方的异常

10

c++销毁堆栈帧上的对象

82

以前的堆栈变量

22

为递归函数绘制堆栈帧

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档