Ошибки при выделении (освобождении) динамической памяти - C (СИ)
Формулировка задачи:
Несложная программа, реализующая алгоритмы поиска строки и подстроки в массиве строк(здесь представлен матрицей).
Казалось бы, ничего особенного, но на выходе дает:"ОС Windows инициировала точку останова в Empty.exe. Это может быть вызвано повреждением кучи и указывает на ошибку в Empty.exe или в одной из загруженных им DLL. Выведенное на экран окно содержит дополнительные данные для диагностики ошибки".
Ну и:"HEAP[Empty.exe]: Heap block at 00332EC0 modified at 00332ECC past requested size of 4".
Где-то какая-то глупость, но я ее ни в какую поймать не могу.
Очень прошу помочь. Ибо самостоятельно вряд ли мы с этим быстро разберемся...
# include <stdio.h> # include <conio.h> # include <cstdlib> # include <malloc.h> char **MS; char *Str; int s,b,dl; char fname[256]; void DelMS(char **MS, int s) { int k; for (k=0; k<s; k++) { delete []MS[k]; } delete []MS; } char **MMS(int *s, int *b) { printf ("Vvedite kolichestvo strok: "); scanf ("%d", s); printf ("Vvedite dlinnu kajdoi stroki: "); scanf ("%d", b); char **MS=new char *[*s+1]; if(*MS==NULL) { return NULL; } for (int i=0;i<=*s;i++) { MS[i]=new char [*b]; if(MS[i]==NULL) { DelMS(MS,i); return NULL; } } return MS; } void Vvod_s_klaviaturi(char **MS, int s) { int i,j; for (i=0; i<s; i++) { printf ("Vvod stroki nomer=%d\n",i); scanf("%s", MS[i]); } } void Vvod_is_faila(char **MS, int s, int b,char fname[]) { FILE *f_in; int i,j; f_in=fopen(fname,"r"); if (f_in==NULL) { printf("Error\n"); } else { for (i=0;i<s ; i++) for (j=0; j<b; j++) { fscanf(f_in, "%s", &MS[i][j]); } } fclose(f_in); } void Vivod_na_ecran_MS(char **MS, int s, int b) { for (int i=0; i<s; i++) { for (int j=0;j<b;j++) { printf ("%c ", MS[i][j]); } printf("\n"); } } int poisk_stroki(char **MS,char *Str, int s,int b, int dl) { int i; int j=0; for (i=0; i<dl; i++) { MS[s][i]=Str[i]; } i=-1; while(j<dl) { j=0; i++; while((MS[i][j]==Str[j])&&(j<=dl)) { j++; } } if(i!=s) { return i; } return -1; } char *vvod_stroki_podstroki(int *dl) { printf("Kakova dlina stroki(podstroki)?\n"); scanf("%d",dl); char *Str=new char [*dl]; printf ("VVEDITE STROKU(PODSTROKU)\n"); scanf ("%s", Str); return Str; } void poisk_podstroki(char **MS,char *Str, int s,int b, int dl) { int key=0; int k=0; int i,j; while(k<s) { i=-1; j=0; while((j!=dl)&&(i!=(b-dl))) { j=0; i++; while((j<dl)&&(MS[k][i+j]==Str[j])) { j++; } } if (j==dl) { printf ("Poisk uspeshen. Podstroka naidena v %d stroke, nachinaia s pozici = %d",k,i); key=1; break; } else k++; } if(key==0) { printf ("Net takoi stroki"); } } void main() { int kn,z; int i; printf ("Kak budem vvodit massiv?\n1-s klavi\n2-iz faila\ndefault-Ne budem nichego vvodit,a luchshe videm"); scanf ("%d", &kn); switch (kn) { 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; case 2: MS=MMS(&s,&b); if (MS!=NULL) { printf("vvedite imia fila:"); char fname[256]; scanf("%s",fname); Vvod_is_faila(MS,s,b,fname); Vivod_na_ecran_MS(MS,s,b); } else printf("Memory error");break; default: return; } if (MS!=NULL) { printf ("Vvod stroki"); Str=vvod_stroki_podstroki(&dl); if(Str!=NULL) { for(;;) { printf ("\nViberite dalneishee dejstvie:\n1-Poisk stroki\n2-Poisk podstroki\n0-vihod\n"); scanf ("%d", &z); switch (z) { case 1: i=poisk_stroki(MS,Str,s,b,dl); if(i!=(-1)) printf ("Naiden po adresu=%d",i); else printf ("Takogo net");break; case 2: poisk_podstroki(MS,Str,s,b,dl);break; case 0: DelMS(MS,s+1); delete []Str; return; default:printf("figniu pishesh"); } } } else printf("Memoty error"); } }
Решение задачи: «Ошибки при выделении (освобождении) динамической памяти»
textual
Листинг программы
case 1: i = poisk_stroki(MS, Str, s, b, dl); if (i != -1) printf("Naiden po adresu=%d", i); else printf("Takogo net"); break;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д