Nod*_*der 2 c stack data-structures
开发商!我在C中有一个堆栈的push()方法的问题!
我在C中实现了自己的push()方法!但我无法理解结果!
我的堆栈代码如下
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 10
int top = -1;
int array[MAX_SIZE];
void init(){
top = -1;
}
void push(int array[], int data){
if(top > MAX_SIZE-1)
fprintf(stderr, "invalid top %d\n", top+1);
else{
array[++top] = data; // top == 9, ++top == 10
printf("top: %d data: %d\n", top+1, array[top]); // top == 11, top == 10
}
}
void pop(int array[]){
}
void peek(int array[]){
}
int main() {
int data = 1;
for (int i=0; i<MAX_SIZE; i++)
push(array, data++);
push(array, 100);
push(array, 200); // invalid top
push(array, 300); // invalid top
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这段代码的结果如下
top: 1 data: 1
top: 2 data: 2
top: 3 data: 3
top: 4 data: 4
top: 5 data: 5
top: 6 data: 6
top: 7 data: 7
top: 8 data: 8
top: 9 data: 9
top: 10 data: 10
top: 11 data: 100
invalid top 11
invalid top 11
Run Code Online (Sandbox Code Playgroud)
我不明白的是......在结果中,顶部:11,实际上,它就像顶部:顶部+ 1.如果你在我的push()方法中查看else语句,你可以注意到它.
但是,在其他声明中,何时
printf("top: %d data: %d\n", 11, array[10]);
the result: top: 11 data: 100
Run Code Online (Sandbox Code Playgroud)
,我认为这应该是一个错误.因为我声明数组大小为10,即MAX_SIZE.因此索引大小将为0~9.但是数组[10]如何工作?
我真的不明白.
小智 5
你可以这样做,因为C允许你这样做.但你不应该因为在未分配的内存区域写入是危险的.您的数组已分配10个长度的整数.分配内存的10个整数.您尝试访问的第11个整数没有为其分配内存.
如评论中所述,如果您希望代码抛出错误,您需要的功能是绑定检查.这正是你在push函数的第一部分所做的.
改变您的条件以top >= MAX_SIZE - 1解决问题.
至于实现堆栈的更好方法,您可以尝试在链表上实现一个,这允许您在已停止的内存区域中管理堆栈.
您也可以使用unsigned int数组索引,因为那里不需要负数.