标题:栈的基本操作,vc编译通过,运行出现问题,调试发现输出栈元素时出现access ...
只看楼主
纷纷
Rank: 1
来 自:广东
等 级:新手上路
帖 子:3
专家分:0
注 册:2015-10-29
结帖率:0
已结贴  问题点数:5 回复次数:5 
栈的基本操作,vc编译通过,运行出现问题,调试发现输出栈元素时出现access violation,为什么出现这种情况?
#include<iostream>
#include<stdlib.h>
#include<assert.h>
using namespace std;
class SeqStack;
ostream &operator<<(ostream &os,SeqStack &s);

const int maxSize=50;
const int stackIncreament=20;
class SeqStack
{
public:
    SeqStack(int sz=50);
    ~SeqStack(){delete[] elements;}
    void Push(const int &x);
    bool IsFull()const{return (top==-1)?true:false;}
    friend ostream &operator<<(ostream &os,SeqStack &s);
private:
    int *elements;
    int top;
    int maxSize;
    void overflowProcess();
};

//构造函数
SeqStack::SeqStack(int sz):top(-1),maxSize(sz)
{
    elements=new int[maxSize];
    assert(elements!=NULL);
}

//新元素x进栈
void SeqStack::Push(const int &x)
{
    if(IsFull()==true)
        overflowProcess();
    elements[++top]=x;
}

//扩充栈的存储空间
void SeqStack::overflowProcess()
{
    int *newArray=new int[maxSize+stackIncreament];
    if(newArray==NULL){cerr<<"存储分配失败!"<<endl;exit(1);}
    for(int i=0;i<top;i++)
        newArray[i]=elements[i];
    maxSize=maxSize+stackIncreament;
    delete []elements;
}

//输出栈中元素的操作
ostream& operator<<(ostream& os,SeqStack& s)
{
    os<<"top="<<s.top<<endl;
    for(int i=0;i<=s.top;i++)
        os<<i<<":"<<s.elements[i]<<endl;
    return os;

}

int main()
{
    int n;
    cout<<"请输入栈的元素(以0结束):";
    cin>>n;
    SeqStack test;
    while(n!=-111)
    {
        test.Push(n);
        cin>>n;
    }
    cout<<test;
    return 0;
}
搜索更多相关主题的帖子: elements private include access public 
2015-10-29 23:16
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:5 
如果你不知道什麽叫“非法存取”,就認住這個詞語,access violation。所有關於指針的錯誤,九成以上你會看到這句話。

授人以渔,不授人以鱼。
2015-10-29 23:48
纷纷
Rank: 1
来 自:广东
等 级:新手上路
帖 子:3
专家分:0
注 册:2015-10-29
得分:0 
回复 2楼 TonyDeng
所以,应该怎么改呢?为什么会访问不了呢?
2015-10-29 23:53
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
野指針啊,溢出啊,對不可存取的内存區讀寫啊,等等,都會引發這種錯誤。在你懷疑有問題的地方,寫一句輸出printf()的信息,看程序在崩潰前,它出現了沒有,如果出現了,那麽錯誤在這一行的後面,把那句話挪後一點,再運行看,直到……你懂的。衹有先把出錯的代碼找出來,亦即程序是哪一句上崩潰的,然後才能知道怎麽查、怎麽改。

[此贴子已经被作者于2015-10-29 23:57编辑过]


授人以渔,不授人以鱼。
2015-10-29 23:56
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
正常寫程序的,都要在寫代碼的時候,腦中把程序跑一遍,實際上不止一遍,要把所有可能的分支都跑一遍,檢測過這樣寫到底有沒有邏輯漏洞,諸如越界之類問題,都可以在這一階段攔截下來,不是寫完一大堆代碼之後靠調試器的,最强大的調試工具是你自己的大腦。如果自己都搞不清楚程序在各種情景下的運行景象,那麽這個程序不是你的,也肯定對它的質量沒把握,連自己都無法維護的程序,就不要指望靠別人替你維護了。

授人以渔,不授人以鱼。
2015-10-30 00:11
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
不用輸出法也可以。先做邏輯分析,估摸著大概是哪裏有問題,就在哪裏設一個斷點,執行程序,看到達斷點之前程序出錯了沒有,如果沒有,就從斷點開始單步執行,直到出錯,這樣就找到出錯行;如果中斷之前已經出錯,那麽把斷點往前調一點再調試。

通常請人幫助之前,最好自己先按這樣的方法,把出錯代碼找出來,并把做了什麽動作出這樣的錯誤也描述清楚,別人好直接切入,不然叫別人替你做,那是沒什麽誠意的。自己該做的、能做的,盡量做好,這樣別人看到,也知道你的努力,幫你也樂意,否則,完全是伸手黨的做派,不理你也無話可説。

[此贴子已经被作者于2015-10-30 00:18编辑过]


授人以渔,不授人以鱼。
2015-10-30 00:15



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-458705-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.357747 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved