Ошибка освобождения динамической памяти - 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].