首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

栈满为什么不会出现错误(C++程序)

2012-02-28 
栈满为什么不会出现异常(C++程序)?C/C++ code//Push.cpp//This program is to Push SqStack# include mal

栈满为什么不会出现异常(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楼说的没错
你可以这样理解
程序所有的代码、数据,都是在它私有的地址空间里,并且都有自己的地址,比如你分配的十个元素,它们的地址是连续的,而指针的初始值就是栈底地址,所以可以用指针的自加很方便的进行访问,但是如果你自己不控制指针的取值,指针就可能越界,访问到你想让它访问的数据的地址空间之外,并且会把指针指向的值当做指针的数据类型来处理。运气好的话越界会出个错告诉你某某地址不可写或者不可读什么的,你就知道越界了,不过经常是没反应,所以你写入了第十一个元素而不出错
只是说你不知道那个地址存放的是谁在用,所以叫未知空间

热点排行