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

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


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

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

5   голосов , оценка 4 из 5
Похожие ответы