Heap Corruption при попытке перевыделить память под массив внутри стру

Тема в разделе "MS Visual C++", создана пользователем Farrel, 16 апр 2010.

  1. Farrel

    Farrel Гость

    Проблема в следующем: есть кольцо структур. В каждой структуре есть два динамических массива: 1-й int, 2-й tm (масив структур). При попытке перевыделить память под любой из них вылетает ошибка Windows has triggered a breakpoint in библиотека на динамике.exe.

    This may be due to a corruption of the heap, which indicates a bug in библиотека на динамике.exe or any of the DLLs it has loaded.

    This may also be due to the user pressing F12 while библиотека на динамике.exe has focus.

    The output window may have more diagnostic information.
    структуры имеют следующий вид
    Код (C++):
    struct book      //ucetnaya kartochka knigi
    {
    char name[30];  //nazvanie knigi
    char autor[30]; //avtor
    int booknum;     //uchetnii nomer knigi
    int maxd;        //maksimalnaya prodolgitelnost vidahi knigi
    int kol;         //kolichestvo ekzemplyarov
    book *f;         //ukazatel na predidushuu kartochku
    book *b;         //ukazatel na sleduushuu karochku
    };
    struct chel      //uchetnaya kartochka chitatelya
    {
    char name[30];    //imya chitatelya
    char surname[30]; //familiya chitatelya
    long tel;        //telefon chitatelya
    int num;          //uchetnii nomer chitatelya
    struct tm *t;  //massiv struktur s ukazaniem vrameni sdachi knig
    int *booknum;  //massiv nomerov vidanih knig
    int last;         //kolichestvo vidanih knig
    chel *r;          //ukazatel na poslednuu dobavlenuu zapis v kolce (otnositelno tochki vhida)
    chel *l;          //ukazatel na vtoruu po nomeru kartochku
    };
    struct set           //struktura hraneniya nastroek
    {
    int min;          //minimalnoe vremya na kotoroe vidaetsya kniga
    int koeff;        //kolichestvo dnei na kotoroe uvelichitsya vremya min s kagdim ekzemplyarom
    int maxbooks;
    };
    void abonement(int i, book* lib, chel* baza,set*s)  //funkciya vidachi/priema knig
    {
    book *b,*bb[10];
    chel *c;
    int l,k,p;
    int n;
    char m='y';
    struct tm *t;
    time_t tp;
    time(&tp);  //poluchenie tekushei dati
    t=localtime(&tp);   //perevid tekushei dati v lokalnii format
    t->tm_year=t->tm_year; 
    c=usersearch(baza); //vizov funkcii poiska chitatelya
    printf("\n");
    if(i==1)    //flag vidachi knig
    {
    c->booknum=(int*)malloc(s->maxbooks*sizeof(int));
    c->t=(tm*)malloc(s->maxbooks*sizeof(tm));
    while(m!='n')
    {
    if(i==1)
    {
    b=booksearch(lib,0);    //poisk knigi
    if(b->kol==0)   //oshibka esli vse knigi vidani
    {
    printf("vse knigi vidani\n");
    }
    else
    {
    printf("vidat knigu?\n1-da\n2-net\n");
    k=0;
    while(k!=1 || (l!=1 && l!=2))
    {
    fflush(stdin);
    k=scanf("%d",&l);
    }

    if(l==1)
    {
    b->kol--;  
    c->booknum[c->last]=b->booknum; //zapis nomera vidavaemoi knigi v kartochku polzovatelya
    c->t[c->last]=*t;   //zapis zapisi raschitanoi dati v sootv slot v strukture
    datacount(b,c,&(c->t[c->last]),c->last);    //vizov funkcii podscheta dati sdachi knigi
    c->last++;  //zapis kolichestva vidanih knig
    }
    }
    }
    puts("vidat eshe odnu? (y/n)");
    m=getch();
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //c->last- количество введенных элементов
    c->booknum=(int*)realloc(c->booknum,(c->last)*sizeof(int));
    c->t=(tm*)realloc(c->t,(c->last)*sizeof(tm));
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    }
    else    //flag ustanovlen na priem knig
    {
    l=0;
    b=lib;
    for(k=0;k<c->last;k++)
    {
    if(c->booknum[k]!=0)
    {
    while(b->booknum!=c->booknum[k]) //poisk imeushihsya u chitatelya knig
    b=b->b;
    bb[l]=b;    //zapis ukazatelya na knigu v massiv
    l++;
    b=lib;  //vozvrat ukazatelya b na biblioteku v pologenie lib
    }
    }
    k=0;
    while(k<l)
    {
    printf("%d %-30s %-30s\n",k,bb[k]->name,bb[k]->autor);
    k++;
    }
    printf("\n99-sdat vse knigi\nchislo ot 0 do 9- udalit sotv. knigu\n");
    m='y';
    while(m!='n')
    {
    p=0;
    n=-1;
    while(p!=1 && !(n==99||n==0||n==1||n==2||n==3||n==4||n==5||n==6||n==7||n==8||n==9))
    {
    fflush(stdin);
    p=scanf("%d",&n);   //vibor regima priema knig
    }
    if(n==99)   //priem vseh knig
    {
    while(k!=0)
    {
    c->booknum[k-1]=0;  //udalenie zapisanogo v kartochku chitatelya nomera knigi
    bb[k-1]->kol++; //uvelichenie kolichestva imeushihsya knig
    k--;
    }
    c->last=0;  //oblulenie kolichestva knig, vidanih chitatelu
    return;
    }
    else    //priem konkretnoi knigi
    {
    c->booknum[n]=0;    //zamena nomera udalyaemoi knigi na 0
    bb[n]->kol++;   //uvelichenie kolichestva imeushihsya knig
    if(n!=c->last-1)
    {
    while(n!=c->last-1)     //cikl perezaposi nomerov vidanih knig v kartochke chitatelya (dlya udaleniya probelov t.e. nulei v massive)
    {
    c->booknum[n]=c->booknum[n+1];  //
    c->booknum[n+1]=0;
    n++;
    }
    c->last=0;
    while(c->booknum[c->last]!=0) c->last++;
    }
    }

    printf("prinyat eshe?\n");
    m=getch();
    }
    }
    }
     
  2. Farrel

    Farrel Гость

    Ко всему прочему обнаружил, что в code gear всё работает идеально, а вот visual по-прежнему не пропускает этот баг.
     
Загрузка...
Похожие Темы - Heap Corruption при
  1. DarkKnight
    Ответов:
    0
    Просмотров:
    2.068

Поделиться этой страницей