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