数据-第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 != '\0') )

    {

        reverse(s + 1);

        printf("%c", *s);

    }

}

int main()

{

    reverse("12345");   

    printf("\n");  

    return 0;

}

运行结果:54321

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

 

小结

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

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

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

posted @ 2019-08-08 18:02  free-锻炼身体  阅读(117)  评论(0编辑  收藏  举报