在visual studio编写稀疏矩阵的过程中运行出现“0xC0000005: 读取位置 0x9A696484 时发生访问冲突。”怎么解决?

在稀疏矩阵的乘法运算过程中运行出现“0xC0000005: 读取位置 0x9A696484 时发生访问冲突。”情况,找了很久都没发现问题,编程小白寻求各位大神帮忙。

稀疏矩阵的乘法那块我是根据严蔚敏的数据结构改写的,出现了错误不知道如何修改。
以下为代码:

#include<stdio.h>
#include<stdlib.h>
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4996)
#define MAXSIZE 100

typedef int DataType;
typedef struct
{
    int row, col;
    DataType value;
}Triple;

typedef struct
{
    Triple data[MAXSIZE + 1];
    int SqPos[10];
    int mu, nu, tu;
}SMaxtrix;

SMaxtrix CreateSMaxtrix()               //创建矩阵
{
    SMaxtrix M;
    int i;
    printf("请输入行数");
    scanf_s("%d", &M.mu);               //输入行数
    printf("请输入列数");
    scanf_s("%d", &M.nu);               //输入列数
    printf("请输入非0的个数");
    scanf_s("%d", &M.tu);
    while (M.tu > M.mu*M.nu)
    {
        printf("输入错误,请重新输入\n");
        scanf_s("%d", &M.tu);
    }
    for (i = 0; i < M.tu; i++)
    {
        printf("请按行序顺序输入第%d个非零元素所在的行(0~%d),""列(0~%d),元素值:(逗号分隔)\n", i, M.mu-1, M.nu-1);
        scanf_s("%d,%d,%d", &M.data[i].row, &M.data[i].col, &M.data[i].value);
    }
    return M;
}

void PrintM(SMaxtrix M) 
{
    int i;
    printf("\n %d行%d列%d个非零元素。\n", M.mu, M.nu, M.tu);
    printf("%4s %4s %8s\n", "row", "col", "value");
    for (i = 0; i < M.tu; i++)
    {
        printf("%4d %4d %8d\n", M.data[i].row, M.data[i].col, M.data[i].value);
    }
}

SMaxtrix TransMatrix(SMaxtrix M)                //矩阵转置
{
    SMaxtrix T;
    int rowsize[MAXSIZE];
    int rowstart[MAXSIZE];
    int i, j, k;
    T.mu = M.nu;
    T.nu = M.mu;
    T.tu = M.tu;
    if (T.tu > 0)
    {
        for (j = 0; j < M.nu; j++)
            rowsize[j] = 0;
        for (i = 0; i < M.tu; i++)
        {
            j = M.data[i].col;
            rowsize[j] = rowsize[j] + 1;
        }
        printf("\n rowsize[]:");
        for (i = 0; i < M.nu; i++)
            printf(" %d ", rowsize[i]);
        printf("\n");
        rowstart[0] = 0;
        for (j = 1; j < M.nu; j++)
            rowstart[j] = rowstart[j - 1] + rowsize[j - 1];
        printf("\n rowstart[]:");
        for (i = 0; i < M.nu; i++)
            printf("%d ", rowstart[i]);
        printf("\n");
        for (i = 0; i < M.tu; i++)
        {
            j = M.data[i].col;
            k = rowstart[j];
            T.data[k].row = M.data[i].col;
            T.data[k].col = M.data[i].row;
            T.data[k].value = M.data[i].value;
            rowstart[j] = rowstart[j] + 1;
        }
    }
    return T;
}

void MultSMaxtrix(SMaxtrix M, SMaxtrix Q)//稀疏矩阵乘法
{
    SMaxtrix N;
    int ctemp[MAXSIZE + 1];
    int tp,p,brow=0,t,q,ccol;
    if (M.nu != Q.mu)
        printf("error");
    N.mu = M.mu;
    N.nu = Q.nu;
    N.tu = 0;//矩阵N初始化
    if (M.tu*Q.tu != 0)//N是非零矩阵
    {
        for (int i = 1; i <= M.mu; i++)//处理M的每一行
        {
            ctemp[0] = 0;//当前行个元素累加器清零
            N.SqPos[i] = N.tu + 1;
            if (i < M.mu)
                tp = M.SqPos[i + 1];
            else
            {
                tp = M.tu + 1;
            }
            for (p = M.SqPos[i]; p < tp; p++)//对当前行中每一个非零元
            {
                brow = M.data[p].col;//找到对应元在N中的行号(编译后这里出现问题!!)
                if (brow < M.mu)
                    t = Q.SqPos[brow + 1];
                else
                {
                    t = Q.tu + 1;
                }
                for (q = Q.SqPos[brow]; q < t; ++q)
                {
                    ccol = Q.data[q].col;//乘积元素在N中列号
                    ctemp[ccol] += M.data[p].value * Q.data[p].value;
                }//for q
            }
            for(ccol =1;ccol<=N.nu;ccol++)//压缩存储该行非零元
                if (ctemp[ccol]) 
                {
                    if (++N.tu > MAXSIZE)
                        printf("error");
                    N.data[N.tu].row = i;
                    N.data[N.tu].col = ccol;
                    N.data[N.tu].value = ctemp[ccol];
                }
        }
    }
    PrintM(N);
}



main()
{
    SMaxtrix M;
    M = CreateSMaxtrix();
    PrintM(M);
    printf("\n");
    SMaxtrix T;
    T = TransMatrix(M);
    PrintM(T);
    SMaxtrix Q;
    Q = CreateSMaxtrix();
    PrintM(Q);
    printf("\n");
    MultSMaxtrix(M, Q);
}