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

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

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

Несложная программа, реализующая алгоритмы поиска строки и подстроки в массиве строк(здесь представлен матрицей). Казалось бы, ничего особенного, но на выходе дает:"ОС Windows инициировала точку останова в Empty.exe. Это может быть вызвано повреждением кучи и указывает на ошибку в Empty.exe или в одной из загруженных им DLL. Выведенное на экран окно содержит дополнительные данные для диагностики ошибки". Ну и:"HEAP[Empty.exe]: Heap block at 00332EC0 modified at 00332ECC past requested size of 4". Где-то какая-то глупость, но я ее ни в какую поймать не могу. Очень прошу помочь. Ибо самостоятельно вряд ли мы с этим быстро разберемся...
Листинг программы
  1. # include <stdio.h>
  2. # include <conio.h>
  3. # include <cstdlib>
  4. # include <malloc.h>
  5.  
  6. char **MS;
  7. char *Str;
  8. int s,b,dl;
  9. char fname[256];
  10.  
  11. void DelMS(char **MS, int s)
  12. {
  13. int k;
  14. for (k=0; k<s; k++)
  15. {
  16. delete []MS[k];
  17. }
  18. delete []MS;
  19. }
  20. char **MMS(int *s, int *b)
  21. {
  22. printf ("Vvedite kolichestvo strok: ");
  23. scanf ("%d", s);
  24. printf ("Vvedite dlinnu kajdoi stroki: ");
  25. scanf ("%d", b);
  26. char **MS=new char *[*s+1];
  27. if(*MS==NULL)
  28. {
  29. return NULL;
  30. }
  31. for (int i=0;i<=*s;i++)
  32. {
  33. MS[i]=new char [*b];
  34. if(MS[i]==NULL)
  35. {
  36. DelMS(MS,i);
  37. return NULL;
  38. }
  39. }
  40. return MS;
  41. }
  42. void Vvod_s_klaviaturi(char **MS, int s)
  43. {
  44. int i,j;
  45. for (i=0; i<s; i++)
  46. {
  47. printf ("Vvod stroki nomer=%d\n",i);
  48. scanf("%s", MS[i]);
  49. }
  50. }
  51.  
  52. void Vvod_is_faila(char **MS, int s, int b,char fname[])
  53. {
  54. FILE *f_in;
  55. int i,j;
  56. f_in=fopen(fname,"r");
  57. if (f_in==NULL)
  58. {
  59. printf("Error\n");
  60. }
  61. else
  62. {
  63. for (i=0;i<s ; i++)
  64. for (j=0; j<b; j++)
  65. {
  66. fscanf(f_in, "%s", &MS[i][j]);
  67. }
  68. }
  69. fclose(f_in);
  70. }
  71. void Vivod_na_ecran_MS(char **MS, int s, int b)
  72. {
  73. for (int i=0; i<s; i++)
  74. {
  75. for (int j=0;j<b;j++)
  76. {
  77. printf ("%c ", MS[i][j]);
  78. }
  79. printf("\n");
  80. }
  81. }
  82. int poisk_stroki(char **MS,char *Str, int s,int b, int dl)
  83. {
  84. int i;
  85. int j=0;
  86. for (i=0; i<dl; i++)
  87. {
  88. MS[s][i]=Str[i];
  89. }
  90. i=-1;
  91. while(j<dl)
  92. {
  93. j=0;
  94. i++;
  95. while((MS[i][j]==Str[j])&&(j<=dl))
  96. {
  97. j++;
  98. }
  99. }
  100. if(i!=s)
  101. {
  102. return i;
  103. }
  104. return -1;
  105. }
  106. char *vvod_stroki_podstroki(int *dl)
  107. {
  108. printf("Kakova dlina stroki(podstroki)?\n");
  109. scanf("%d",dl);
  110. char *Str=new char [*dl];
  111. printf ("VVEDITE STROKU(PODSTROKU)\n");
  112. scanf ("%s", Str);
  113. return Str;
  114. }
  115.  
  116. void poisk_podstroki(char **MS,char *Str, int s,int b, int dl)
  117. {
  118. int key=0;
  119. int k=0;
  120. int i,j;
  121. while(k<s)
  122. {
  123. i=-1;
  124. j=0;
  125. while((j!=dl)&&(i!=(b-dl)))
  126. {
  127. j=0;
  128. i++;
  129. while((j<dl)&&(MS[k][i+j]==Str[j]))
  130. {
  131. j++;
  132. }
  133. }
  134. if (j==dl)
  135. {
  136. printf ("Poisk uspeshen. Podstroka naidena v %d stroke, nachinaia s pozici = %d",k,i);
  137. key=1;
  138. break;
  139. }
  140. else
  141. k++;
  142. }
  143. if(key==0)
  144. {
  145. printf ("Net takoi stroki");
  146. }
  147. }
  148.  
  149. void main()
  150. {
  151. int kn,z;
  152. int i;
  153. printf ("Kak budem vvodit massiv?\n1-s klavi\n2-iz faila\ndefault-Ne budem nichego vvodit,a luchshe videm");
  154. scanf ("%d", &kn);
  155. switch (kn)
  156. {
  157. case 1: MS=MMS(&s,&b); if (MS!=NULL) Vvod_s_klaviaturi(MS,s); else printf("Memory error");Vivod_na_ecran_MS(MS,s,b);break;
  158. case 2: MS=MMS(&s,&b); if (MS!=NULL)
  159. {
  160. printf("vvedite imia fila:");
  161. char fname[256];
  162. scanf("%s",fname);
  163. Vvod_is_faila(MS,s,b,fname);
  164. Vivod_na_ecran_MS(MS,s,b);
  165. }
  166. else printf("Memory error");break;
  167. default: return;
  168. }
  169. if (MS!=NULL)
  170. {
  171. printf ("Vvod stroki");
  172. Str=vvod_stroki_podstroki(&dl);
  173. if(Str!=NULL)
  174. {
  175. for(;;)
  176. {
  177. printf ("\nViberite dalneishee dejstvie:\n1-Poisk stroki\n2-Poisk podstroki\n0-vihod\n");
  178. scanf ("%d", &z);
  179. switch (z)
  180. {
  181. case 1: i=poisk_stroki(MS,Str,s,b,dl); if(i!=(-1)) printf ("Naiden po adresu=%d",i); else printf ("Takogo net");break;
  182. case 2: poisk_podstroki(MS,Str,s,b,dl);break;
  183. case 0:
  184. DelMS(MS,s+1);
  185. delete []Str;
  186. return;
  187. default:printf("figniu pishesh");
  188. }
  189. }
  190. }
  191. else
  192. printf("Memoty error");
  193. }
  194. }

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

textual
Листинг программы
  1.     case 1:
  2.         i = poisk_stroki(MS, Str, s, b, dl);
  3.         if (i != -1)
  4.             printf("Naiden po adresu=%d", i);
  5.         else
  6.             printf("Takogo net");
  7.         break;

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


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

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

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

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

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

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