首页 > 解决方案 > C中损坏的堆,我不知道为什么

问题描述

所以我必须编写一个处理稀疏矩阵的程序,我有我的头部指针和指针数组。

当我构建此代码时,它不会返回任何错误,但是当我实际使用该程序时,它会说堆已损坏。我不知道该怎么做

PS 对难以理解的评论感到抱歉,我的母语是塞尔维亚语,所以我只是用它来评论我的大学项目的代码。

#include <stdio.h>
#include <stdlib.h>
#define maxR 10
#define maxC 10
#define maxE 10

typedef struct node 
{
int val;
int row;
int col;
struct node *nextD;
struct node *nextR;
} element;


 typedef struct matrix 
{
element *row[maxR];
element *col[maxC];
}matrix;


int main() {

int Row; //redni broj reda
int Col;//redni broj kolone
int Val; //vrednost
int e;// broj nepodrazumevanih elemenata
int r; //broj redova
int c; // broj kolona
int i; // brojac redova
int j; //brojac kolona
int userInput; //korisnikov izbor u meniju
int podrazumevani;
int x, y;
int X;
int n_of_elements = 0; //broj nepodrazumevanih elemenata u listi

element* novi;
element *trenutni;
trenutni = NULL;

matrix* M = malloc(sizeof(matrix));
for (i = 0; i < maxR; i++) 
{

    M->row[i] = NULL;
}
for (i = 0; i < maxR; i++)
{

    if (M->row[i] == NULL) 
    {
        printf("NULLR\n");
    };
}

for (j = 0; j < maxC; j++)
{

    M->col[j] = NULL;
}
while (1)
{
    printf(
        "1. Ucitavanje matrice sa nepodrazumevanim vrednostima\n"
        "2. Postavljanje podrazumevanih vrednosti\n" //ucitavanje sa ulaza
        "3. Dohvatanje zadatog elementa\n" //prolazenje kroz listu i ispisivanje na ekran Note to self: u zavisnosti da li je efikasnije ici po kolonama ili redovima
        "4. Postaviti vrednost zadatom elementu\n" //ucitavanje koordinata elemenata i prolazak kroz listu, menjanje vrednosti elementa
        "5. Ispisivanje broja nepodrazumevanih elemenata\n" // prolazi se kroz matricu i inkrementira brojac ako je element razlicit od nule
        "6. Ispis cele matrice\n"
        "7. Brisanje matrice\n" // radi se pomocu free funkcije
        "0. Izlaz iz programa\n");

    scanf_s("%d", &userInput);

    switch (userInput)
    {
    case 0:
        exit(1);
    case 1:
        printf("Unesite broj redova matrice: \n");
        scanf_s("%d", &r);
        if ((r > maxR) || (r < 0))
        {
            printf("Uneli ste veci broj od maksimuma (10) ili ste uneli negativan, pokusajte ponovo: \n");
            scanf_s("%d", &r);
        }
        printf("Unesite broj kolona matrice: \n");
        scanf_s("%d", &c);
        if ((c > maxC) || (c < 0))
        {
            printf("Uneli ste veci broj od maksimuma (10) ili ste uneli negativan, pokusajte ponovo: \n");
            scanf_s("%d", &c);
        }
        printf("Unesite broj nepodrazumevanih elemnata matrice: \n");
        scanf_s("%d", &e);
        if ((e > maxE) || (e < 0) || (e > (0.1*r*c)))
        {
            printf(
                "Uneli ste veci broj od maksimuma (10) ili ste uneli negativan, "
                "ili veci broj nego sto je uslovljen unetim r i c vrednostima, 10 procenata od r*c, pokusajte ponovo: \n"
            );
            scanf_s("%d", &e);
        }
        for (int x = 0; x < e; x++) //petlja koja kontrolise broj cvorova
        {


            printf("Unesite redni broj vrste: \n");
            scanf_s("%d", &Row);
            printf("Unesite redni broj kolone: \n");
            scanf_s("%d", &Col);
            printf("Unesite element matrice veci od nule: \n");
            scanf_s("%d", &Val);

            novi = malloc(sizeof(novi));
            novi->row = Row;
            novi->col = Col;
            novi->val = Val;
            novi->nextR = NULL;
            novi->nextD = NULL;

            //kreiranje R niza 

            for (i = 0; i < r; i++)
            {

                if (i == (Row - 1)) //ako se indeks niza poklapa sa unetom vrednoscu onda se prelazi na upis
                {
                    //element* trenutni = novi;
                    if (M->row[i] == NULL)
                    {
                        M->row[i] = novi;
                    }
                    else
                        trenutni->nextR = novi;
                    trenutni = novi;
                }
                // lista ce morati da se sortira po rastucoj vrednosti u Col

            }

            /*for (j = 0; j < c; j++)
            {

                if (j == Col - 1)
                {




        }
                }
*/




}
         for (i = 0; i < r; i++) 
       {


if (M->row[i] != NULL)
                {
                    element* temp = NULL;
                    temp = M->row[i];
                    while (temp)
                    {
                        printf("%d->", temp->val);
                        temp = temp->nextR;
                    }
                }
                else printf("NULL\n");

            }

        break;
    case 2:
        printf("Unesite podrazumevani element, pozeljno 0:  \n");
        scanf_s("%d", &podrazumevani);
        break;
    case 3:
        printf("Unesite koordinate elementa koji zelite da prikazete na ekranu (x za vrstu, y za kolonu): \n");
        scanf_s("%d", &x);
        scanf_s("%d", &y);



        break;
    case 4:
        printf("Unesite koordinate i vrednost elementa koji zelite da azurirate prikazete na ekranu (x za vrstu, y za kolonu): \n");
        scanf_s("%d", &x);
        scanf_s("%d", &y);
        scanf_s("%d", &X);

        break;
    case 5:

        break;
    case 6:



        break;
    case 7:
        break;
    case 8:
        break;
    }
}
}

标签: clinked-listsparse-matrixheap-memory

解决方案


分配不正确。

代码为一个指针分配空间。而是分配给指向对象的大小。

// novi = malloc(sizeof(novi));
novi = malloc(sizeof *novi);

推荐阅读