首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

0xC0000005: 写下位置 0x00000000 时发生访问冲突

2013-07-16 
0xC0000005: 写入位置 0x00000000 时发生访问冲突写了个程序,能运行,但是会出现如题的情况,先贴代码这是ma

0xC0000005: 写入位置 0x00000000 时发生访问冲突
写了个程序,能运行,但是会出现如题的情况,
先贴代码
这是ma.h


#include<iostream>
#include <cassert>
using namespace std;
template<typename T>
class mat
{
private:
class riple
{
public:
int i;
int j;
T e;
};
public:
mat();
    void oper(int j,int k, int **s);
    void change();
void out();
mat<T> operator+(mat<T>right);
mat(const mat<T>&s);
protected:
int rownum;
int colnum;
int totalnum;
riple *data;
};
template<typename T>
mat<T>::mat()
{
data=NULL;
rownum=0;
colnum=0;
totalnum=0;
}
template<typename T>
void mat<T>::oper(int j,int k, int **s)
{
for(int i=0;i<j;i++)
{
for(int n=0;n<k;n++)
{
if(s[i][n]!=0)
{
totalnum+=1;
data[i].i=i;
data[i].j=n;
data[i].e=s[i][n];
}
}
}
}
template<typename T>
void mat<T>::change()
{  
int **s=new int*[rownum];
int *ss=new int[rownum*colnum];
for(int i=0;i!=0;i++)
s[i]=ss+rownum*colnum;
int i=0,j=0;
for(;i!=rownum;i++)
{
for(;j!=colnum;++j)
{
if(i!=data[i].i||j!=data[i].j)
s[i][j]=0;
else
s[i][j]=data[i].e;
}
}
for(int i=0;i!=rownum;i++)
{
for(int j=0;j!=colnum;j++)
{cout<<s[i][j]<<" ";}
cout<<endl;
}
}
template<typename T>
void mat<T>::out()
{}
template<typename T>
mat<T>mat<T>::operator +(mat<T>right)
{
int k1=0,k2=0,k3=0;
mat S,T;
if(rownum=right.rownum&&colnum==right.colnum)
{
T.rownum=S.rownum=rownum;
T.colnum=S.colnum=colnum;
}
if(totalnum+right.totalnum)
{
S.data=new riple[totalnum+right.totalnum];
assert(S.data!=0);
while(k1<totalnum&&k2<right.totalnum)
{
if(data[k1].i<right.data[k2].i||data[k1].i==right.data[k2].i&&data[k1].j<right.data[k2].j)
{
S.data[k3].i=data[k1].i;
S.data[k3].j=data[k1].j;
S.data[k3].e=data[k1].e;
k3++;
k1++;
}
else if(data[k1].i==right.data[k2].i&&data[k1].j==right.data[k2].j)
{
if(data[k1].e+right.data[k2].e)
{
S.data[k3].i=data[k1].i;


    S.data[k3].j=data[k1].j;
    S.data[k3].e=data[k1].e;
     k3++;
}
k1++;
k2++;
}
else
{
S.data[k3].i=data[k2].i;
S.data[k3].j=data[k2].j;
S.data[k3].e=data[k2].e;
k3++;
k2++;
}
}
while(k1<totalnum)
{
S.data[k3].i=data[k1].i;
S.data[k3].j=data[k1].j;
S.data[k3].e=data[k1].e;
k3++;
k1++;
}
while(k2<right.totalnum)
{
S.data[k3].i=data[k2].i;
S.data[k3].j=data[k2].j;
S.data[k3].e=data[k2].e;
k3++;
k2++;
}
T.totalnum=k3;
T.data=new riple[T.totalnum];
assert(T.data!=0);
for(int k3=0;k3<T.totalnum;++k3)
{
T.data[k3].i=S.data[k3].i;
T.data[k3].j=S.data[k3].j;
T.data[k3].e=S.data[k3].e;
}
}
return T;
}
template<typename T>
mat<T>::mat(const mat<T>&s)
{
rownum=s.rownum;
colnum=s.colnum;
totalnum=s.totalnum;
if(totalnum)
{
data=new riple[totalnum];
assert(data!=0);
for(int k=0;k<totalnum;++k)
{
data[k].i=s.data[k].i;
data[k].j=s.data[k].j;
data[k].e=s.data[k].e;
}
}
else
data=NULL;
}

这是源文件

#include<iostream>
#include <cassert>
using namespace std;
template<typename T>
class mat
{
private:
class riple
{
public:
int i;
int j;
T e;
};
public:
mat();
    void oper(int j,int k, int **s);
    void change();
void out();
mat<T> operator+(mat<T>right);
mat(const mat<T>&s);
protected:
int rownum;
int colnum;
int totalnum;
riple *data;
};
template<typename T>
mat<T>::mat()
{
data=NULL;
rownum=0;
colnum=0;
totalnum=0;
}
template<typename T>
void mat<T>::oper(int j,int k, int **s)
{
for(int i=0;i<j;i++)
{
for(int n=0;n<k;n++)
{
if(s[i][n]!=0)
{
totalnum+=1;
data[i].i=i;
data[i].j=n;
data[i].e=s[i][n];
}
}
}
}
template<typename T>
void mat<T>::change()
{  
int **s=new int*[rownum];
int *ss=new int[rownum*colnum];
for(int i=0;i!=0;i++)
s[i]=ss+rownum*colnum;


int i=0,j=0;
for(;i!=rownum;i++)
{
for(;j!=colnum;++j)
{
if(i!=data[i].i||j!=data[i].j)
s[i][j]=0;
else
s[i][j]=data[i].e;
}
}
for(int i=0;i!=rownum;i++)
{
for(int j=0;j!=colnum;j++)
{cout<<s[i][j]<<" ";}
cout<<endl;
}
}
template<typename T>
void mat<T>::out()
{}
template<typename T>
mat<T>mat<T>::operator +(mat<T>right)
{
int k1=0,k2=0,k3=0;
mat S,T;
if(rownum=right.rownum&&colnum==right.colnum)
{
T.rownum=S.rownum=rownum;
T.colnum=S.colnum=colnum;
}
if(totalnum+right.totalnum)
{
S.data=new riple[totalnum+right.totalnum];
assert(S.data!=0);
while(k1<totalnum&&k2<right.totalnum)
{
if(data[k1].i<right.data[k2].i||data[k1].i==right.data[k2].i&&data[k1].j<right.data[k2].j)
{
S.data[k3].i=data[k1].i;
S.data[k3].j=data[k1].j;
S.data[k3].e=data[k1].e;
k3++;
k1++;
}
else if(data[k1].i==right.data[k2].i&&data[k1].j==right.data[k2].j)
{
if(data[k1].e+right.data[k2].e)
{
S.data[k3].i=data[k1].i;
    S.data[k3].j=data[k1].j;
    S.data[k3].e=data[k1].e;
     k3++;
}
k1++;
k2++;
}
else
{
S.data[k3].i=data[k2].i;
S.data[k3].j=data[k2].j;
S.data[k3].e=data[k2].e;
k3++;
k2++;
}
}
while(k1<totalnum)
{
S.data[k3].i=data[k1].i;
S.data[k3].j=data[k1].j;
S.data[k3].e=data[k1].e;
k3++;
k1++;
}
while(k2<right.totalnum)
{
S.data[k3].i=data[k2].i;
S.data[k3].j=data[k2].j;
S.data[k3].e=data[k2].e;
k3++;
k2++;
}
T.totalnum=k3;
T.data=new riple[T.totalnum];
assert(T.data!=0);
for(int k3=0;k3<T.totalnum;++k3)
{
T.data[k3].i=S.data[k3].i;
T.data[k3].j=S.data[k3].j;
T.data[k3].e=S.data[k3].e;
}
}
return T;
}
template<typename T>
mat<T>::mat(const mat<T>&s)
{
rownum=s.rownum;
colnum=s.colnum;
totalnum=s.totalnum;
if(totalnum)
{
data=new riple[totalnum];
assert(data!=0);
for(int k=0;k<totalnum;++k)
{
data[k].i=s.data[k].i;
data[k].j=s.data[k].j;
data[k].e=s.data[k].e;
}
}
else
data=NULL;
}


我上网也查了这个问题,说是数组越界问题,但我找不出哪里越界了,为什么越界了,怎么修改这个问题


求解答,最好能详细点
[解决办法]
崩溃的时候进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码处。

热点排行