[英]How does the stack_overflow() function work?
因此,我刚进入书中解释堆栈的部分。 在我的书(代码)中定义它们的方式如下:
#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
定义? 如果是这样,当他们接到电话时会发生什么? 如果没有,我应该自己定义它们吗? 另外,出于好奇,是否有一个库已经定义了所有堆栈函数?
要按顺序回答您的问题:
make_empty()
之所以这样工作,是因为push()
函数将元素放在堆栈的当前top
。 是的, contents
仍然具有来自堆栈的旧值,但这并不重要,因为它们将被覆盖。
我认为将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 }
top
变量告诉实现,堆栈的顶部在哪里,或者等效地,它包含多少个元素。 这说明逻辑内容,而不是堆栈占用的物理内存。 因为此实现使用数组存储堆栈元素,所以每个可用位置将始终存储一些值。 关键问题是与真正的堆栈元素 相对应 ,而这正是top
所描述的。 因此, make_empty()
通过调整top
来说堆栈存储不包含实际的堆栈元素而起作用。 整个存储可用于元素。
stack_overflow()
和stack_underflow()
不是标准函数。 名称似乎旨在传达在这种情况下发生堆栈溢出或堆栈下溢的想法,而没有指定任何特定行为。
现实世界中的实现可能会实现那些功能以发出诊断消息,返回错误代码(如果为示例提供了实现,但示例中没有提供),终止,或者如果有点伪劣,则在这些行为中开始未定义的行为案件。 在溢出的情况下,也可能会扩展堆栈,但是您的特定示例的详细信息并没有提供这种可能性。
make_empty()函数如何工作?
这样考虑:您期望make_empty
有什么作用? 好吧,显然要清空堆栈,但是就我们拥有的接口而言,这意味着什么呢? 有两件事:
is_empty
应该为true。 设置top = 0
可以做到吗? 是的,因为is_empty
只检查top == 0
。 top = 0
可以做到吗? 是的,因为如果is_empty
为true, pop
会导致下溢。 STACK_SIZE
次。 设置top = 0
可以做到吗? 是的,因为push
每次都会使top
每次增加一,并且直到top == STACK_SIZE
引起溢出。 因此,如果top
为零,我们可以按STACK_SIZE
次。 通过仅将top初始化为0,内容仍然加载了所有元素...内容是否也应该初始化?
要什么? 大小为0的数组? 我们不能这样做,因为已声明contents
大小为STACK_SIZE
,而不是0。数组的大小是固定的,并且永远不会改变。
我们可以将所有元素都设置为0,但这实际上不会完成任何事情。 索引>= top
的元素的值永远不会影响任何东西,那么为什么要麻烦更改它们呢?
2个stack_overflow()和stack_underflow()函数有什么作用?
大概他们应该告诉用户发生了上溢或下溢,然后退出应用程序或调用某种错误处理程序。
是否在stdio.h中默认定义了它们的行为?
没有。
如果没有,我应该自己定义它们吗?
想必。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.