Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.04.2010, 00:45   #1
Farrel
Форумчанин
 
Аватар для Farrel
 
Регистрация: 21.04.2010
Сообщений: 144
По умолчанию Heap Corruption при попытке перевыделить память под массив внутри структуры

Проблема в следующем: есть кольцо структур. В каждой структуре есть два динамических массива: 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.
Причём н code gear всё пашет как часы, ошибка вылетает на visual studio 2008, а на 5-й версии visual код вроде сработал, но вот инфа в массивах затёрлась.
привожу кусок кода и структуры.

Код:
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- количество введенных элементов
        //ВЫЛЕТАЕТ ОШИБКА ПРИ ЛЮБОМ ИЗ 2Х REALLOC 
        c->booknum=(int*)realloc(c->booknum,(c->last)*sizeof(int));  
        c->t=(tm*)realloc(c->t,(c->last)*sizeof(tm));
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Farrel вне форума Ответить с цитированием
Старый 21.04.2010, 00:45   #2
Farrel
Форумчанин
 
Аватар для Farrel
 
Регистрация: 21.04.2010
Сообщений: 144
По умолчанию

Код:
 }
    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();
        }
    }
}
Farrel вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В конструкторе выделяется память под массив. Как быть с перегрузкой оператора = ? TwiX Общие вопросы C/C++ 6 15.12.2009 12:18
HEAP CORRUPTION удаляю массив delias Общие вопросы C/C++ 1 10.12.2009 10:17
приложение подвисает, при попытке обновить шрифты AnTe Общие вопросы Delphi 2 07.12.2009 11:36
Ощибка при попытке заменить компонент ogg Помощь студентам 3 16.07.2009 18:57
ошибка при попытке запустить программу Fellot Общие вопросы Delphi 3 23.04.2009 21:23