c语言之堆栈溢出问题 您所在的位置:网站首页 程序堆栈溢出导致word文档内的空白 c语言之堆栈溢出问题

c语言之堆栈溢出问题

2024-07-01 12:00| 来源: 网络整理| 查看: 265

目录) 1.函数的调用,系统所作的工作2.函数调用时与内存管理3.递归函数

1.函数的调用,系统所作的工作

对于c来说,函数调用,系统要做三个工作:

1.函数在执行过程中,一但遇到函数调用,系统首先为每个形参分配存储单元,并计算实参表达式的值,然后把实参复制到对应形参的存储单元,实参和形参按照顺序一一对应2.将控制转移到被调用的函数,执行其函数体内的语句3.当执行到return语句或者函数结尾时,控制返回到调用函数,如果有返回值,回送一个值并返回控制,然后从函数调用点继续执行。函数调用点指的是:若函数调用出现在表达式中,则调用点是该表达式,若函数调用单独中作为一个语句出现,则返回时执行该语句的下一条语句。

这里多提一下,关于数组作为形参调用函数时,为什么需要连同数组长度一起传进来? 这里是因为,数组作为参数传递的本质只是一个指针,也就是一个地址,编译器并不关心这个地址后边有多少有用数据,编译器只看得到指针所指的数据。所以在被调用函数中,无法直接知道这个数组的长度,所以当被调用函数想要使用数组长度时,最方便就是将数组长度作为形参传递进来,进而可以在传进来的数组的指针处依次往后读取数组长度个的数据。

2.函数调用时与内存管理

函数调用时,系统内存通常分为代码区、数据区和堆栈区,具体如下图: 在这里插入图片描述 其中代码区和常量存储区属于只读存储区,用来存放程序代码和部分常量;静态存储区用来存放外部变量和静态局部变量,堆区是程序进行动态分配管理的内存区域;栈区是在函数调用过程中存放函数局部变量、函数参数和返回地址信息的内存区域。堆区和栈区通常合称为堆栈,属于动态存储区。

系统在进行函数调用时需要用到堆栈,堆栈是一种“后进先出”的数据结构。当程序调用一个函数时,被调函数必须知道如何返回到主调函数,所以主调函数的返回地址必须压入函数调用栈。如果发生了一系列的函数调用,其对应的一组返回地址将按照后进先出的顺序压入到函数调用栈,这样每个函数才能正确的返回到它的主调函数。

函数的每次调用通常会产生一些局部变量,这些局部变量会保存在函数调用栈中,这些数据被称为函数调用的活动记录。当发生一次函数调用时,它所对应的活动记录将被压入函数调用栈。当函数调用结束后返回到主调函数后,它对应的活动记录将被弹出函数调用栈,保存在其中的局部变量将不能被程序所访问。

函数调用栈中用来保存活动记录的存储单元的总数有一个上限,如果连续发生的多次函数调用产生的活动记录超过了这一上限,将会发生堆栈溢出的错误。

3.递归函数

递归函数就是直接或者通过其他函数间接的调用自己的函数。

下面以阶乘的递归函数进行介绍,

int fact(int n) { if(n


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有