Ошибка освобождения динамической памяти - 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].
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д