+ -
当前位置:首页 → 问答吧 →  0xC0000005: 写入位置 0x00000000 时发生访问冲突

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

时间:2011-12-06

来源:互联网

写了个程序,能运行,但是会出现如题的情况,
先贴代码
这是ma.h
[code=C/C++][/code]
#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;
}
[code=C/C++][/code]
我上网也查了这个问题,说是数组越界问题,但我找不出哪里越界了,为什么越界了,怎么修改这个问题
求解答,最好能详细点

作者: liao4052   发布时间: 2011-12-06

源文件发错了
这是源文件
#include<iostream>
#include"ma.h"
using namespace std;
void gerator(mat<int>&s1);
void out1(mat<int>&s1,int m);
void out2(mat<int>&S1,int m);
void plus(mat<int>&s1,mat<int>&S1,int m);
void menu();
void main()
{
int i,m=1;
mat<int> s1,S1;
bool a=false;
while(1)
{
menu();
cin>>i;
switch(i)
{
case 0:a=true;
case 1:if(m==1)
{

gerator(s1);
m++;
}
else if(m==2)
{
gerator(S1);
m++;
}
else
{
{cout<<"只能创建两个矩阵"<<endl;}
}

case 2:plus(s1,S1,m);break;
case 3:out1(s1,m);break;
case 4:out2(S1,m);break;
}
if(a)
break;

}
}
void menu()
{
cout<<"----------------------1.建立一个矩阵(只能创建两个矩阵)---------------------"<<endl;
cout<<"----------------------2.实现两矩阵相加----------------------------------------"<<endl;
cout<<"----------------------3.输出第一个三元组信息----------------------------------"<<endl;
cout<<"----------------------4.输出第二个三元组信息----------------------------------"<<endl;
}
void gerator(mat<int>&s1)
{
  int n,h;
cout<<"请输入矩阵的行号"<<endl;
cin>>n;
cout<<"请输入矩阵的列号"<<endl;
cin>>h;
int **c=new int*[n];
for(int i=0;i!=n;i++)
c[i]=new int[h];
for(int i=0;i!=n;i++)
{
for(int j=0;j!=h;j++)
{
cin>>c[i][j];
}
}
s1.oper(n,h,c);
s1.change();
for(int i=0;i!=h;i++)
{
delete[] c[i];
}
delete[] c;
}
void out1(mat<int>&s1,int m)
{
if(m>1)
s1.out();
}
void out2(mat<int>&S1,int m)
{
if(m==3)
S1.out();
else
cout<<"还没创建第二个三元组"<<endl;
}
void plus(mat<int>&s,mat<int>&S1,int m)
{
if(m<3)
cout<<"还没有两个三元组"<<endl;
else if(m==3)
s+S1;
}

作者: liao4052   发布时间: 2011-12-06

地址0x00000000是不可以写的。系统保留了。不知道程序和你说的有关系吗?

作者: lofeo   发布时间: 2011-12-06

不好怎么说,要么你运行下程序。在建立一个矩阵的时候会弹出一个窗口,窗口写着:矩阵.exe 中的 0x00f01fbb 处未处理的异常: 0xC0000005: 写入位置 0x00000000 时发生访问冲突

作者: liao4052   发布时间: 2011-12-06

指针访问了系统禁止访问的内存,ox00000000就是

作者: jackhanzy   发布时间: 2011-12-06

野指针,查看所有指针在操作前对象是否都已创建

作者: yby4769250   发布时间: 2011-12-06