栈满为什么不会出现异常(C++程序)?
- C/C++ code
//Push.cpp//This program is to Push SqStack# include <malloc.h># include <iostream.h># include <conio.h># define STACK_INIT_SIZE 10# define STACKINCREMENT 10# define OK 1# define ERROR 0typedef int SElemType;typedef struct SqStack //define structure SqStack{ SElemType *base; SElemType *top; int stacksize;}SqStack;int Push(SqStack &S,SElemType e) //Push() sub-function{ /*if(S.top-S.base>S.stacksize) { S.base=(SElemType *)realloc(S.base,(S.stacksize+ STACKINCREMENT*sizeof(SElemType))); if(!S.base) { cout<<endl<<"Overflow!"; return (ERROR); } S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; }*/ *S.top++=e; return (OK);} //Push() endvoid main() //main() function{ SElemType e; SqStack S; S.stacksize=STACK_INIT_SIZE; S.base=S.top=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); int a = 5; //(S.top)=(&a); //initial the old SqStack *S.top++=5; *S.top++=8; *S.top++=12; *S.top++=18; *S.top++=30; *S.top++=37; SElemType *p; //*p = *(S.top-1);//【local variable 'p' used without having been initialized】 //p = S.top-1; cout<<endl<<endl<<"*S.top=" << *(S.top-1); //cout<<endl<<endl<<"*p=" << *p; cout<<endl<<"========"; cout<< endl << "stack memory:" << S.stacksize; cout<<endl<<endl<<"The old SqStack is (base to top) : "; for(p=S.base;p!=S.top;p++) //output the old SqStack cout<<*p<<" "; while(true){ cout<<endl<<"Please input the data to push into the SqStack : "; cin>>e; if(Push(S,e)) cout<<"Success! S.top = "<<e; //output S.top cout<<endl<<"The new SqStack is : "; for(p=S.base;p!=S.top;p++) //output the new SqStack cout<<*p<<" "; cout<< endl << "element number count:" << S.top-S.base << endl;//S.top-S.base } cout<<endl<<endl<<"...OK!..."; //getch();}这是严蔚敏数据结构书上的源代码,我稍微改了下,为了测试在栈满的情况下会出现什么情况,所以不另外分配空间(把realloc部分注释掉了),却发现栈满(我初始化为10个元素),也不会出现异常。
[解决办法]
空闲存储区大,自由存储区比较小。用new,delete 等操作占的是自由存储空间,所以new了一定要delete。
楼主的栈是个结构体,而且是SqStack S; 的定义对象,不是new 开辟的,所以占用的不是自由存储区,是空闲存储区。
就像3楼说的,影响比较小的情况下可能不会出错误。 我认为就是这样了。
[解决办法]
malloc是在进程堆中申请的空间,你申请了10个元素大小的空间,系统会在进程堆中寻找大于等于此大小的空间,找到后就把首地址返回给你了。这个空间可能不是正好10个元素的大小,一般都会大于你申请的大小。后面的空间可能没有其他的函数用到,所以没出错,如果其他函数正好用到,会出问题的。2L说的 有道理
[解决办法]
11楼说的没错
你可以这样理解
程序所有的代码、数据,都是在它私有的地址空间里,并且都有自己的地址,比如你分配的十个元素,它们的地址是连续的,而指针的初始值就是栈底地址,所以可以用指针的自加很方便的进行访问,但是如果你自己不控制指针的取值,指针就可能越界,访问到你想让它访问的数据的地址空间之外,并且会把指针指向的值当做指针的数据类型来处理。运气好的话越界会出个错告诉你某某地址不可写或者不可读什么的,你就知道越界了,不过经常是没反应,所以你写入了第十一个元素而不出错
只是说你不知道那个地址存放的是谁在用,所以叫未知空间