c语言 函数 栈,C语言函数栈帧

kodinid 10 0

大家好,今天小编关注到一个意思的话题,关于c语言 函数 栈的问题,于是小编就整理了5个相关介绍c语言 函数 栈的解答,让我们一起看看吧。

  1. c语言函数调用规则?
  2. C/C++函数调用,栈溢出,该怎么解决?
  3. 函数调用用栈还是队列?
  4. 函数中定义的对象是在栈中还是在堆中?
  5. C语言函数退出后,局部变量就被释放了,为何会有这一过程?

c语言函数调用规则?

c语言函数的调用规则主要有以下几点:

1.函数调用的前后,栈帧的压栈和弹栈;

c语言 函数 栈,C语言函数栈帧-第1张图片-安济编程网
图片来源网络,侵删)

2.调用函数时,参数的压栈,返回值的弹栈;

3.局部变量声明使用

4.栈的使用;

c语言 函数 栈,C语言函数栈帧-第2张图片-安济编程网
(图片来源网络,侵删)

5.调用函数的结构,调用函数后的处理

C/C++函数调用,栈溢出,该怎么解决?

栈溢出一般操作指针有关系(包括本质上是指针的各种形式),比如调用不定变量个数的函数时(像printfscanf这种),没有按约定传入适当的参数个数;函数操作传入的数组下标越界等;得到指向局部变量的指针后,做不合适的偏移操作。以上这些都有可能造成栈溢出。

函数调用用栈还是队列

函数调用用栈。

c语言 函数 栈,C语言函数栈帧-第3张图片-安济编程网
(图片来源网络,侵删)

堆栈的先入后出式操作顺序,适用于函数的嵌套调用。队列先入先出则不适用。

比如:(堆栈的操作是在栈顶完成的)

main函数调用A函数,现场参数压栈,栈结构:【[栈顶][调用A现场][栈底]】

A函数再调用B函数后:【[栈顶][调用B现场][调用A现场][栈底]】

当从B返回时,在栈顶可以拿到刚才入栈的[调用B现场]参数,从A返回时,[调用A现场]参数这回到了栈顶,正好使用。

函数中定义对象是在栈中还是在堆中?

首先说明这里的堆和栈不等同于数据结构

堆和栈的概念。这里的

堆和栈都是内存中的一部分,有着不同的作用,而且一个程序需要在这片区域上分配内存。

1

栈内存

(stack)

栈是用来存储函数内部(包括main函数)的局部变量和方法调用和函数参数值,是由系统自动分配的,一般速度较快;存储地址是连续且存在有限栈容量,会出现溢出现象。

2

堆内存

(heap)

堆是由corder手动分配释放的,通过malloc和new等动态申请内存的语句使用,也需要用户手动回收(或可能在程序结束时OS自动回收),而对于面向对象程序来说,new出来的任何对象,无论是对象内部的成员变量,局部变量,类变量,他们指向的对象都存储在堆内存中(但指针本身存在栈中),一般速度较栈慢;存储地址通常是链式的,内存较大不会溢出。


个人的理解,有错希望大牛指出,谢谢。

C语言函数退出后,局部变量就被释放了,为何会有这一过程

这个问题我正好整理过:

之前我的文章里讨论过C语言中的全局变量和局部变量,并且介绍了局部变量在函数返回后,就会被释放。而全局变量却可以一直保存到程序结束,这是为什么呢?

在回答这个问题之前,请看下面这张非常经典的图:这个图就是程序在运行所需的内存布局。简单来说,就是程序在运行时会占用内存,占用的内存每个区域用途都是不同的,有的区域用做堆区,有的用做栈区,等等。

为什么函数返回时,局部变量就不能用了

程序每调用一个函数,系统就自动在栈区划分一块区域给该函数使用,函数内部定义的局部变量,也存在此处。因为并不能知道系统分配的栈区原来填充的是什么样的数据,所以如果函数内部定义的局部变量没有初始化(没有赋初值)就使用它,它的值也是未知的。

当函数执行完毕,返回时,系统将收回这块分配的栈区,所以函数的局部变量的值就不能继续使用了。

说了这么多空的,我们来看一个例子,下面的代码非常简单,就是在 test 函数中定一个了一个局部 int 型变量 i,然后打印出它的值,再赋值为 321,然后在 main 函数中调用 它两次。

到此,以上就是小编对于c语言 函数 栈的问题就介绍到这了,希望介绍关于c语言 函数 栈的5点解答对大家有用。

标签: 函数 调用 变量

上一个学习python爬虫要多久,学python爬虫需要多久

下一个300本编程免费教程,300本编程免费教程下载