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]
我上网也查了这个问题,说是数组越界问题,但我找不出哪里越界了,为什么越界了,怎么修改这个问题
求解答,最好能详细点
先贴代码
这是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;
}
这是源文件
#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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28