Ошибки при выделении (освобождении) динамической памяти - 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;