• 数据-第18课-栈与递归


    第18课-栈与递归

    C语言中的疑惑

    讨论中……

    小A:C语言中常说“局部变量在栈上分配空间”,那么这个地方的“栈”和我们之前学习的栈数据结构有关系吗?

    小B:我觉得应该没关系吧 :我觉得应该没关系吧,只是名称碰巧一致而已吧?!

    1. 函数调用时的栈

    (1)程序中的“函数调用栈”是栈数据结构的一种应用。

    (2)函数调用栈一般是从高地址向低地址增长的。

    l  栈底为内存的高地址处。

    l  栈顶为内存的低地址处。

    (3)函数调用栈中存储的数据为活动记录

    2. 活动记录

    活动记录是函数调用时一系列相关信息的记录。

     

     

    3. 函数调用过程

    4. 程序中的栈

    (1)      程序中的栈空间可看做一个顺序栈的应用。

    (2)      栈保存了一个函数调用所需的维护信息。

    (3)      函数参数,函数返回地址 ,函数返回地址。

    l  局部变量。

    l  函数调用上下文。

    5. 栈的溢出

    (1)      在不断的压栈过程中造成栈空间耗尽而产生栈溢出。

    (2)      栈溢出常由于函数递归过深或局部数组过大造成。

    #include <stdio.h>

    void reverse(char* s)

    {

        if( (s != NULL) && (*s != '') )

        {

            reverse(s + 1);

            printf("%c", *s);

        }

    }

    int main()

    {

        reverse("12345");   

        printf(" ");  

        return 0;

    }

    运行结果:54321

    分析:第一次的递归*s指向的是1,之后一次是2,3,4,5。这些结果一次进栈。这些的递归是以reverse(s + 1);为界限的,当所有的文件递归结束后,再让我们之前指向的数据依次出栈。所以我们看到的最后结果是54321。我们这里要明白一点,那就是递归函数是要进栈的。

    小结

    (1)程序栈空间在本质上是一种顺序栈。

    (2)程序栈空间的访问是通过函数调用进行的。

    (3)程序栈空间仍然遵从后进先出的规则。

  • 相关阅读:
    redis运维手册
    grafana展示ES中的nginx日志-地图展示
    nginx针对yum安装nginx重编译
    K8S-yaml里初始化容器
    K8S-资源配置清单补充1
    K8S-资源配置清单详解
    Docker cp 提示“no space left on device”
    磁盘
    ansible 对文件内容的操作
    ansible 初始化系统分区格式化
  • 原文地址:https://www.cnblogs.com/free-1122/p/11322800.html
Copyright © 2020-2023  润新知