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

”发生访问冲突“ 一般情况下说明访问了不该访问的内存

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错误。矩阵转置时则发生访问冲突。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值