Поврежденная куча в C и я понятия не имею, почему - PullRequest
2 голосов
/ 11 марта 2019

Так что мне нужно написать программу, которая работает с разреженными матрицами, у меня есть голова и массивы указателей.

когда я строю этот код, он не возвращает ошибок, но когда я на самом делеиспользуйте программу, которая говорит, что куча повреждена.Я понятия не имею, что делать

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;
    }
}
}

1 Ответ

1 голос
/ 11 марта 2019

Неправильное распределение.

Код выделенного пространства для одного указателя.Вместо этого выделите размер указанного объекта.

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