Lỗi "Unhandled exception thrown: write access violation"

mình đang làm bài tập nhân 2 ma trận thưa, chương trình k có errors nhưng lúc chạy thì bị break vào báo như vầy

“Unhandled exception thrown: write access violation.
s2T->element was 0xA7B12DCE.”

struct Element {
    int i, j;
    int value;
};

struct  SparseMatrix
{
    int M, N, num;  // num so phan tu khac 0
    struct Element* element;
};
SparseMatrix* mul(SparseMatrix s1, SparseMatrix s2)
    {
        //////your code here/////
        SparseMatrix* result;
        SparseMatrix* s2T;
        if (s1.N != s2.M ) 
        {
            return nullptr;
        }
        s2T = new SparseMatrix;
        s2T->M = s2.N;
        s2T->N = s2.M;
        s2T->num = s2.num;
        s2T->element = new Element[s2T->num];

        for (int i = 0; i < s2T->num; i++) // mình gán ở đây thì k sao
        {
            s2T->element[i].i = 0;
            s2T->element[i].j = 0;
            s2T->element[i].value = 0;
        }

        int* count = new int[s2.N + 1];
        for (int i = 1; i <= s2.N; i++)
            count[i] = 0;
        for (int i = 0; i < s2.num; i++)
            count[s2.element[i].j]++;
        int* index = new int[s2.N + 1];
        index[0] = 0;
        for (int i = 1; i <= s2.N; i++)
        {
            index[i] = index[i - 1] + count[i - 1];
        }

        for (int i = 0; i < s2.num; i++)
        {
            int rpos = index[s2.element[i].j]++;

            s2T->element[rpos].i = s2.element[i].j; // chương trình báo lỗi ở đây
            s2T->element[rpos].j = s2.element[i].i;
            s2T->element[rpos].value = s2.element[i].value;
        }

        result = new SparseMatrix;
        int n = s1.num + s2.num;
        result->M = s1.M;
        result->N = s2.N;
        result->num = n;
        result->element = new Element[n];

        int apos, bpos,i;
        i = 0;
        for ( apos = 0; apos < s1.num;)
        {
            int r = s1.element[apos].i;
            for (bpos = 0; bpos < s2T->num;)
            {
                int c = s2T->element[bpos].i;

                int tempa = apos;
                int tempb = bpos;
                int s = 0;
                while (tempa < s1.num && s1.element[tempa].i ==r && 
                    tempb <s2T->num && s2T->element[tempb].i ==c )
                {
                    if (s1.element[tempa].j < s2T->element[tempb].j)
                        tempa++;
                    if (s1.element[tempa].j > s2T->element[tempb].j)
                        tempb++;
                    else
                    {
                        s += s1.element[tempa++].value * s2T->element[tempb++].value;
                    }
                }
                if (s != 0)
                {
                    result->element[i].value = s;
                    result->element[i].i = r;
                    result->element[i].j = c;
                    i++;
                }
                while (bpos < s2T->num && s2T->element[bpos].i == c)
                    bpos++;
            }
            while (apos < s1.num && s2T->element[apos].i == r)
                apos++;
        }

        

        ////// end your code /////
    }

rpos đã đảm bảo nằm trong mảng không? Theo như bạn khao báo thì s2T->element = new Element[s2T->num]; tức mảng này gồm s2T->num phần tử, nếu rpos là số âm, hoặc lớn hơn s2T->num thì…

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?