大家好,今天小编关注到一个有意思的话题,关于c语言 函数 栈的问题,于是小编就整理了5个相关介绍c语言 函数 栈的解答,让我们一起看看吧。
c语言函数调用规则?
c语言函数的调用规则主要有以下几点:
1.函数调用的前后,栈帧的压栈和弹栈;
4.栈的使用;
大家好,今天小编关注到一个有意思的话题,关于c语言 函数 栈的问题,于是小编就整理了5个相关介绍c语言 函数 栈的解答,让我们一起看看吧。
c语言函数的调用规则主要有以下几点:
1.函数调用的前后,栈帧的压栈和弹栈;
4.栈的使用;
栈溢出一般和操作指针有关系(包括本质上是指针的各种形式),比如调用不定变量个数的函数时(像printf、scanf这种),没有按约定传入适当的参数个数;函数操作传入的数组下标越界等;得到指向局部变量的指针后,做不合适的偏移操作。以上这些都有可能造成栈溢出。
函数调用用栈。
堆栈的先入后出式操作顺序,适用于函数的嵌套调用。队列先入先出则不适用。
比如:(堆栈的操作是在栈顶完成的)
main函数调用A函数,现场参数压栈,栈结构:【[栈顶][调用A现场][栈底]】
A函数再调用B函数后:【[栈顶][调用B现场][调用A现场][栈底]】
当从B返回时,在栈顶可以拿到刚才入栈的[调用B现场]参数,从A返回时,[调用A现场]参数这回到了栈顶,正好使用。
首先说明这里的堆和栈不等同于数据结构中
堆和栈的概念。这里的
堆和栈都是内存中的一部分,有着不同的作用,而且一个程序需要在这片区域上分配内存。
1
栈内存
(stack)栈是用来存储函数内部(包括main函数)的局部变量和方法调用和函数参数值,是由系统自动分配的,一般速度较快;存储地址是连续且存在有限栈容量,会出现溢出现象。
2
堆内存
(heap)堆是由corder手动分配释放的,通过malloc和new等动态申请内存的语句使用,也需要用户手动回收(或可能在程序结束时OS自动回收),而对于面向对象程序来说,new出来的任何对象,无论是对象内部的成员变量,局部变量,类变量,他们指向的对象都存储在堆内存中(但指针本身存在栈中),一般速度较栈慢;存储地址通常是链式的,内存较大不会溢出。
个人的理解,有错希望大牛指出,谢谢。
这个问题我正好整理过:
之前我的文章里讨论过C语言中的全局变量和局部变量,并且介绍了局部变量在函数返回后,就会被释放。而全局变量却可以一直保存到程序结束,这是为什么呢?
在回答这个问题之前,请看下面这张非常经典的图:这个图就是程序在运行所需的内存布局。简单来说,就是程序在运行时会占用内存,占用的内存每个区域用途都是不同的,有的区域用做堆区,有的用做栈区,等等。
为什么函数返回时,局部变量就不能用了
程序每调用一个函数,系统就自动在栈区划分一块区域给该函数使用,函数内部定义的局部变量,也存在此处。因为并不能知道系统分配的栈区原来填充的是什么样的数据,所以如果函数内部定义的局部变量没有初始化(没有赋初值)就使用它,它的值也是未知的。
当函数执行完毕,返回时,系统将收回这块分配的栈区,所以函数的局部变量的值就不能继续使用了。
说了这么多空的,我们来看一个例子,下面的代码非常简单,就是在 test 函数中定一个了一个局部 int 型变量 i,然后打印出它的值,再赋值为 321,然后在 main 函数中调用 它两次。
到此,以上就是小编对于c语言 函数 栈的问题就介绍到这了,希望介绍关于c语言 函数 栈的5点解答对大家有用。