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

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

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

Столкнулся с проблемой ошибка при очистке динамической памяти помогите разобраться что я сделал не так
Листинг программы
  1. #include <stdio.h>//типа кросворд из двух слов
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5. #define A 20
  6. char *Input(int *cw)//ввожу два слова в динамический массив
  7. {
  8. int i;
  9. char **words = 0, wd[A];//динамический массив и массив для слова
  10. printf("input two words\n");
  11. words = calloc(*cw, 1);
  12. for(i = 0; i < *cw; i++)
  13. {
  14. scanf("%s",wd);
  15. words[i] = calloc(strlen(wd)+1, 1);
  16. strcpy(words[i], wd);
  17. }
  18. return words;
  19. }
  20. int *Sort(char **words, int *t)// определение пересечений слов
  21. {
  22. int i, j, **n = 0, *c = 0;
  23. for(i = 0; words[0][i]; i++)
  24. for(j = 0; words[1][j]; j++)
  25. if(words[0][i] == words[1][j])
  26. {
  27. n = realloc(n, (++*t * sizeof(int*)));
  28. n[*t-1] = calloc(2, sizeof(int));
  29. n[*t-1][0] = i + 1;
  30. n[*t-1][1] = j + 1;
  31. }
  32. if(!*t)//если пересечений нет выходим
  33. {
  34. printf("no matches found\n");
  35. exit(1);
  36. }
  37. srand(time(0));
  38. c = calloc(3, sizeof(int));
  39. c[0] = rand() % 2;//определяем слово по вертикали и горизонтали
  40. i = rand() % *t;//определяем случайное перечисление
  41. c[1] = n[i][0];
  42. c[2] = n[i][1];
  43. for(i = 0; i < *t; i++)
  44. free(n[i]);
  45. free(n);
  46. return c;
  47. }
  48. void Print(char **words, int *c)
  49. {
  50. int i, j, a, b, t1, t2 = 0, t3 = 1;
  51. char *t;
  52. if(c[0])//определение слова вертикаль горизонталь
  53. {
  54. t = words[0];
  55. words[0] = words[1];
  56. words[1] = t;
  57. t1 = c[t2+1];
  58. c[t2+1] = c[t3+1];
  59. c[t3+1] = t1;
  60. t1 = t2;
  61. t2 = t3;
  62. t3 = t1;
  63. }
  64. b = strlen(words[t2]);
  65. a = strlen(words[t3]);
  66. for(i = 0; i < a; i++)
  67. {
  68. for(j = 0; j < b; j++)
  69. {
  70. if(c[t3+1] - 1 == i)
  71. putc(words[t2][j], stdout);
  72. else if(c[t2+1] - 1 == j)
  73. putc(words[t3][i], stdout);
  74. else
  75. putc('-', stdout);
  76. }
  77. putc('\n', stdout);
  78. }
  79. }
  80. int main()
  81. {
  82. char **words = 0;
  83. int cw = 2, t = 0, *c = 0, i;
  84. words = Input(&cw);
  85. c = Sort(words, &t);
  86. Print(words, c);
  87. free(c);
  88. for(i = 0; i < cw; i++)
  89. free(words[i]);
  90. free(words);//здесь ошибку выдает!!!!!!
  91. system("pause");
  92. return 0;
  93. }

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

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

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

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

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


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

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

14   голосов , оценка 4.286 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы