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