Ошибка освобождения динамической памяти - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Столкнулся с проблемой ошибка при очистке динамической памяти помогите разобраться что я сделал не так
#include <stdio.h>//типа кросворд из двух слов
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define A 20
 
char *Input(int *cw)//ввожу два слова в динамический массив
{
    int i;
    char **words = 0, wd[A];//динамический массив и массив для слова
    printf("input two words\n");
    words = calloc(*cw, 1);
    for(i = 0; i < *cw; i++)
    {
        scanf("%s",wd);
        words[i] = calloc(strlen(wd)+1, 1);
        strcpy(words[i], wd);
    }
    return words;
}
 
int *Sort(char **words, int *t)// определение пересечений слов
{
    int i, j, **n = 0, *c = 0;
    for(i = 0; words[0][i]; i++)
        for(j = 0; words[1][j]; j++)
            if(words[0][i] == words[1][j])
            {
                n = realloc(n, (++*t * sizeof(int*)));
                n[*t-1] = calloc(2, sizeof(int));
                n[*t-1][0] = i + 1;
                n[*t-1][1] = j + 1;
            }
    if(!*t)//если пересечений нет выходим
    {
        printf("no matches found\n");
        exit(1);
    }
    srand(time(0));
    c = calloc(3, sizeof(int));
    c[0] = rand() % 2;//определяем слово по вертикали и горизонтали
    i = rand() % *t;//определяем случайное перечисление
    c[1] = n[i][0];
    c[2] = n[i][1];
    for(i = 0; i < *t; i++)
        free(n[i]);
    free(n);
    return c;
}
 
void Print(char **words, int *c)
{
    int i, j, a, b, t1, t2 = 0, t3 = 1;
    char *t;
    if(c[0])//определение слова вертикаль горизонталь
    {
        t = words[0];
        words[0] = words[1];
        words[1] = t;
        t1 = c[t2+1];
        c[t2+1] = c[t3+1];
        c[t3+1] = t1;
        t1 = t2;
        t2 = t3;
        t3 = t1;
    }
    b = strlen(words[t2]);
    a = strlen(words[t3]);
    for(i = 0; i < a; i++)
    {
        for(j = 0; j < b; j++)
        {
            if(c[t3+1] - 1 == i)
                putc(words[t2][j], stdout);
            else if(c[t2+1] - 1 == j)
                putc(words[t3][i], stdout);
            else
                putc('-', stdout);
        }
        putc('\n', stdout);
    }
}
 
int main()
{
    char **words = 0;
    int cw = 2, t = 0, *c = 0, i;
    words = Input(&cw);
    c = Sort(words, &t);
    Print(words, c);
    free(c);
    for(i = 0; i < cw; i++)
        free(words[i]);
    free(words);//здесь ошибку выдает!!!!!!
    system("pause");
    return 0;
}

Решение задачи: «Ошибка освобождения динамической памяти»

textual
Листинг программы
words[i] = calloc(strlen(wd)+1, 1);

Объяснение кода листинга программы

В данном коде выделяется память под массив указателей на слова. Каждому слову в массиве words[i] выделяется память под строку, длина которой равна strlen(wd)+1. strlen(wd) — это длина строки слова, которую нужно сохранить, плюс 1 для '\0' в конце строки. Каждое выделение памяти заключается в присвоении адреса начала памяти под строку соответствующему элементу массива words[i].

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.286 из 5
Похожие ответы