stack_overflow()函数如何工作?

时间:2018-12-07 15:23:49

标签: c

因此,我刚进入书中解释堆栈的部分。在我的书(代码)中定义它们的方法如下:

#include <stdbool.h>

#define STACK_SIZE 100

int contents[STAC_SIZE]
int top = 0;

void make_empty(void){
    top = 0;
}

bool is_empty(void){
    return top == 0;
}

bool is_full(void){
    return top == STACK_SIZE;
}

void push(int i){
    if(is_full()){
        stack_overflow();
    }
    else{
        contents[top++] = I;
    }

int pop(void){
    if(is_empty()){
        stack_underflow();
    }
    else{
        return contents[--top];
    }
}

我在这里没有两件事:

  • make_empty()函数如何工作?通过仅将top初始化为0,contents仍然所有元素都已加载... contents是否也应该初始化?
  • 这两个stack_overflow()stack_underflow()函数的作用是什么?是否在stdio.h中默认定义了它们的行为?如果是这样,当他们接到电话时会发生什么?如果没有,我应该自己定义它们吗?

出于好奇,还有一个库已经定义了所有堆栈函数吗?

3 个答案:

答案 0 :(得分:1)

按顺序回答您的问题:

  1. make_empty()之所以这样工作,是因为push()函数将元素放在堆栈的当前top中。是的,contents仍然具有来自堆栈的旧值,但这并不重要,因为它们将被覆盖。

  2. 我认为将stack_overflow()stack_underflow()放在此处只是为了说明在对整个堆栈进行推入或对空堆栈进行弹出操作时的正常行为。它们未在stdio.h中实现。如果确实需要,您可以自己创建它们并包含一个printf,例如

    void stack_overflow()
    {
       printf("Stack Overflow! The program will crash!");
       exit(1); //this function exits the program. It is defined in stdlib.h
    }
    

答案 1 :(得分:1)

top变量告诉实现,堆栈的顶部在哪里,或者等效地,它包含多少个元素。这说明了逻辑的内容,而不是堆栈所占用的物​​理内存。因为此实现使用数组存储堆栈元素,所以每个可用位置将始终存储一些值。关键问题是对应于真正的 stack元素,而这正是top所描述的。因此,make_empty()的工作方式是调整top以说堆栈存储区不包含实际的堆栈元素。整个存储可用于元素。

stack_overflow()stack_underflow()不是标准功能。这些名称似乎旨在传达在这种情况下发生堆栈溢出或堆栈下溢的想法,而未指定任何特定行为。

现实世界中的实现可能会实现那些功能以发出诊断消息,返回错误代码(如果为示例提供了实现,但示例中没有提供),终止,或者如果有点伪劣,则开始未定义在这些情况下的行为。在溢出的情况下,也可能会扩展堆栈,但是您的特定示例的详细信息并没有实现这种可能性。

答案 2 :(得分:1)

  

make_empty()函数如何工作?

这样思考:您期望make_empty会产生什么影响?好吧,显然要清空堆栈,但是就我们拥有的接口而言,这意味着什么呢?两件事:

  • 清空堆栈后,is_empty应该为true。设置top = 0是否可以达到目的?是的,因为is_empty仅检查了top == 0
  • 清空堆栈后,弹出堆栈会导致下溢。设置top = 0是否可以达到目的?是的,因为如果pop为真,is_empty将会导致下溢。
  • 在清空堆栈之后,我们应该能够推送STACK_SIZE次,直到溢出为止。设置top = 0是否可以达到目的?是的,因为push每次将top加1,并且直到top == STACK_SIZE才会引起溢出。因此,如果top为零,我们可以推动STACK_SIZE次。
  

通过仅将top初始化为0,内容仍然加载了所有元素...内容也应该不初始化吗?

要做什么?大小为0的数组?我们不能这样做,因为已声明contents的大小为STACK_SIZE,而不是0。数组的大小是固定的,永远不会改变。

我们可以将所有元素设置为0,但这实际上不会完成任何事情。索引为>= top的元素的值永远不会影响任何东西,那么为什么要麻烦更改它们?

  

两个stack_overflow()和stack_underflow()函数有什么作用?

大概是应该告诉用户发生了上溢或下溢,然后退出应用程序或调用某种错误处理程序。

  

默认情况下,stdio.h中是否定义了它们的行为?

否。

  

如果没有,我应该自己定义它们吗?

大概。