”发生访问冲突“ 一般情况下说明访问了不该访问的内存
1、给数组分配的空间较小,而初始化时赋的值太大
2、指针在使用前就已经被释放
程序报错如下:
全部代码如下:
#include "SparseMatrix.h"
Status FastTransposeSMatrix(TSMatrix M, TSMatrix& T) {
// 采用三元组顺序表存储表示,求稀疏矩阵M的转置矩阵T
int j, p, q, t;
int* num; // 保存每一列中的非零元个数
int* cpos; // 保存转置后每列第一非零元应当在T中所处的序号
//练习1:矩阵T初始化:T.mu、T.nu和T.tu分别应当被初始化为什么值?
T.mu = M.nu; T.nu = M.mu; T.tu = M.tu;
T.data = (Triple*)malloc(sizeof(Triple) * (T.tu + 1));
num = (int*)malloc((M.nu + 1) * sizeof(int));
cpos = (int*)malloc((M.nu + 1) * sizeof(int));
if (NULL == num || NULL == cpos)
return OVERFLOW;
if (T.tu != 0) {
for (j = 1; j <= M.nu; ++j) // 初始化num向量
num[j] = 0;
for (t = 1; t <= M.tu; ++t) //练习2:求M中每一列所含非零元的个数,存放于num中
++num[M.data[t].j];
cpos[1] = 1;
for (j = 2; j <= M.nu; ++j) //练习3:求每一列的第一个非零元在b.data中的序号
cpos[j] = cpos[j - 1] + num[j - 1];
for (p = 1; p <= M.tu; ++p) { // 转置矩阵元素
j = M.data[p].j;
q = cpos[j]; // cpos[j]指向第j列第一个非零元的位置
//练习4:转置元素
T.data[q].i = M.data[p].j; T.data[q].j = M.data[p].i;
T.data[q].e = M.data[p].e;
//练习5:令cpos[j]指向第j列下一个非零元的位置
++cpos[j];
}
}
free(num);
free(cpos);
return OK;
错误原因:将”“cpos[1]=1”.这里本意为确定第一个元素的位置为1,但是在初始化时正确写法应为
“cpos[1]={1};”。用此方法可将第一个元素设为1,其余元素都为0.
cpos的位置混乱之后,每个元素的位置都乱了。后期“cpos[j]指向第j列第一个非零元的位置”时。令“q=cpos[j];”则q错误。矩阵转置时则发生访问冲突。