Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Непонятное поведение free(), программа падает после free() 
V
    Опции темы
Pori
Дата 24.5.2009, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 10.9.2007

Репутация: нет
Всего: 1



Вот код на Си:

Код

#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <conio.h>

struct Node;

struct ChildNode{
        struct ChildNode *prev;
        struct ChildNode *next;
        struct Node *element;
};
typedef struct ChildNode childnode;

struct Node{
        int index;
        double value;
        childnode *parent;
        childnode *children;
};
typedef struct Node node;

struct List{
        int count;
        struct List *prev;
};
typedef struct List list;

node *first;
int count = 0;

node *GetElementByIndex(int index, node *t)
{
        node *temp = NULL;
        childnode *c;

        if (t==NULL)
               return NULL;
        if (t->index==index)
                return t;
        c=t->children->next;
        if (c==NULL)
                return NULL;
        while (c!=NULL)
        {
                temp=GetElementByIndex(index,c->element);
                if (temp!=NULL)
                        break;
                c=c->next;
        }
        if (temp!=NULL)
                return temp;
        return NULL;
}

int AddNode(int index, double value)
{
        node *t, *temp;
        childnode *c, *child;

        if (first==NULL)
        {
                temp = (node *)malloc(sizeof(node));
                temp->value = value;
                temp->index = 1;
                temp->children = (childnode*)malloc(sizeof(childnode));
                temp->children->prev = NULL;
                temp->children->next = NULL;
                temp->children->element = NULL;
                first=temp;
                count=1;
                return 0;
        }
       
        t = GetElementByIndex(index,first);
        if (t==NULL)
                return -1;

        ++count;
        temp = (node *)malloc(sizeof(node));
        child = (childnode*)malloc(sizeof(child));
        temp->value = value;
        temp->index = count;
        temp->parent = child;
        temp->children = (childnode*)malloc(sizeof(childnode));
        temp->children->prev = NULL;
        temp->children->next = NULL;
        temp->children->element = NULL;
        child->next = NULL;
        child->element = temp;
        c=t->children;
        while (c->next!=NULL)
                c=c->next;
        child->prev = c;
        c->next = child;
        return 0;
}

void PrintTree(const char *str, node *p)
{
        childnode *c;
        char temp[50];

        if (p==NULL)
                return;
        printf("%s%i: %0.2f\n",str,p->index,p->value);
        if (p->children->next==NULL)
                return;
        strcpy(temp,str);
        strcat(temp,"\t\0");
        c=p->children->next;
        while (c!=NULL)
        {
                PrintTree(temp,c->element);
                c=c->next;
        }
        return;
}

void DeleteTree(node *p)
{
        childnode *c, *cTemp;

        c=p->children->next;
        while (c!=NULL)
        {
            DeleteTree(c->element);
                cTemp = c;
            c = c->next;
                free(cTemp);                                  //Падает тут
                cTemp = NULL;
        }
        free(p->children);
        if (first==p)
                first = NULL;
        else
        {
                if (p->parent->next!=NULL)
                        p->parent->next->prev = p->parent->prev;
                p->parent->prev->next = p->parent->next;
        }
        p->parent->element=NULL;
            free(p);
}

void Delete(int index)
{
        node *t;

        if (first==NULL)
                return;
        t = GetElementByIndex(index,first);
        if (t==NULL)
                return;
        DeleteTree(t);
        return;
}

int main()
{
        char c;
        int index, cnt;
        double value;
        
        do
        {
                c = getch();
                switch(c)
                {
                        case '1':
                                PrintTree("", first); break;
                        case '2':
                                printf("Input index and value to input: "); scanf("%i%le",&index,&value); AddNode(index,value); break;
                        case '3':
                                printf("Input index to delete"); scanf("%i",&index); Delete(index); break;
                }
        } while (c!='4');
}




программа строит дерево, печатает его, удаляет узлы (с удалением всех дочерних узлов).

в борладне все работает. Под *nix системами после компиляции gcc и в win после компиляции VS2008 падает после удаления узла дерева, имеющего потомка. Не могу разобраться почему, вроде все корректно выделяю, да и free передаю тот же адрес, что выделил мне malloc. Помогите разобраться, пожалуйста.

Выделю место, где программа падает, на всякий:

Код

  c=p->children->next;
        while (c!=NULL)
        {
            DeleteTree(c->element);
                cTemp = c;
            c = c->next;
                free(cTemp);                                  //Падает тут
                cTemp = NULL;
        }

PM MAIL   Вверх
MAKCim
Дата 24.5.2009, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Pori @  24.5.2009,  16:22 Найти цитируемый пост)
Под *nix системами после компиляции gcc и в win после компиляции VS2008 падает после удаления узла дерева,

если под *nix падает, то попробуй следующее
1) скомпилить с отладочной инфой (ключи -ggdb -g)
2) запустить через valgrind
Код

# valgrind --log-file=<file> --trace-children=yes --tool=memcheck --leak-check=full --leak-resolution=high --num-callers=40 <your program here>



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Pori
Дата 25.5.2009, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 10.9.2007

Репутация: нет
Всего: 1



Спасибо, полезная утилита. Но в данном случае мне она не разъяснила ситуацию, а только запутала:

Код

==4956== Invalid read of size 4
==4956==    at 0x80485AB: AddNode (lab23_2.c:64)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956==  Address 0x418e024 is 4 bytes before a block of size 20 alloc'd
==4956==    at 0x4024D0E: malloc (vg_replace_malloc.c:207)
==4956==    by 0x804858E: AddNode (lab23_2.c:62)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956== 
==4956== Invalid read of size 4
==4956==    at 0x80485C3: AddNode (lab23_2.c:65)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956==  Address 0x418e020 is 8 bytes before a block of size 20 alloc'd
==4956==    at 0x4024D0E: malloc (vg_replace_malloc.c:207)
==4956==    by 0x804858E: AddNode (lab23_2.c:62)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956== 
==4956== Invalid read of size 4
==4956==    at 0x804861A: AddNode (lab23_2.c:70)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956==  Address 0x418e06c is 4 bytes before a block of size 12 alloc'd
==4956==    at 0x4024D0E: malloc (vg_replace_malloc.c:207)
==4956==    by 0x80485F2: AddNode (lab23_2.c:68)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956== 
==4956== Invalid read of size 4
==4956==    at 0x8048635: AddNode (lab23_2.c:71)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956==  Address 0x418e068 is 8 bytes before a block of size 12 alloc'd
==4956==    at 0x4024D0E: malloc (vg_replace_malloc.c:207)
==4956==    by 0x80485F2: AddNode (lab23_2.c:68)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956== 
==4956== Invalid read of size 4
==4956==    at 0x80486E9: AddNode (lab23_2.c:87)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956==  Address 0x418e0ac is 4 bytes before a block of size 4 alloc'd
==4956==    at 0x4024D0E: malloc (vg_replace_malloc.c:207)
==4956==    by 0x80486CC: AddNode (lab23_2.c:85)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956== 
==4956== Invalid read of size 4
==4956==    at 0x8048701: AddNode (lab23_2.c:88)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956==  Address 0x418e0a8 is 8 bytes before a block of size 4 alloc'd
==4956==    at 0x4024D0E: malloc (vg_replace_malloc.c:207)
==4956==    by 0x80486CC: AddNode (lab23_2.c:85)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956== 
==4956== Invalid read of size 4
==4956==    at 0x804873B: AddNode (lab23_2.c:91)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956==  Address 0x418e0e4 is 4 bytes before a block of size 20 alloc'd
==4956==    at 0x4024D0E: malloc (vg_replace_malloc.c:207)
==4956==    by 0x804871E: AddNode (lab23_2.c:89)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956== 
==4956== Invalid read of size 4
==4956==    at 0x8048753: AddNode (lab23_2.c:92)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956==  Address 0x418e0e0 is 8 bytes before a block of size 20 alloc'd
==4956==    at 0x4024D0E: malloc (vg_replace_malloc.c:207)
==4956==    by 0x804871E: AddNode (lab23_2.c:89)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956== 
==4956== Invalid read of size 4
==4956==    at 0x80487B5: AddNode (lab23_2.c:98)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956==  Address 0x418e12c is 4 bytes before a block of size 12 alloc'd
==4956==    at 0x4024D0E: malloc (vg_replace_malloc.c:207)
==4956==    by 0x804878D: AddNode (lab23_2.c:96)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956== 
==4956== Invalid read of size 4
==4956==    at 0x80487D0: AddNode (lab23_2.c:99)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956==  Address 0x418e128 is 8 bytes before a block of size 12 alloc'd
==4956==    at 0x4024D0E: malloc (vg_replace_malloc.c:207)
==4956==    by 0x804878D: AddNode (lab23_2.c:96)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956== 
==4956== Invalid write of size 4
==4956==    at 0x804880B: AddNode (lab23_2.c:103)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956==  Address 0x418e0b4 is 0 bytes after a block of size 4 alloc'd
==4956==    at 0x4024D0E: malloc (vg_replace_malloc.c:207)
==4956==    by 0x80486CC: AddNode (lab23_2.c:85)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956== 
==4956== Invalid write of size 4
==4956==    at 0x8048818: AddNode (lab23_2.c:104)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956==  Address 0x418e0b8 is 4 bytes after a block of size 4 alloc'd
==4956==    at 0x4024D0E: malloc (vg_replace_malloc.c:207)
==4956==    by 0x80486CC: AddNode (lab23_2.c:85)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956== 
==4956== Invalid read of size 4
==4956==    at 0x8048520: GetElementByIndex (lab23_2.c:45)
==4956==    by 0x804869E: AddNode (lab23_2.c:80)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956==  Address 0x418e0b8 is 4 bytes after a block of size 4 alloc'd
==4956==    at 0x4024D0E: malloc (vg_replace_malloc.c:207)
==4956==    by 0x80486CC: AddNode (lab23_2.c:85)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956== 
==4956== Invalid read of size 4
==4956==    at 0x8048520: GetElementByIndex (lab23_2.c:45)
==4956==    by 0x8048AED: Delete (lab23_2.c:180)
==4956==    by 0x8048D03: main (lab23_2.c:259)
==4956==  Address 0x418e0b8 is 4 bytes after a block of size 4 alloc'd
==4956==    at 0x4024D0E: malloc (vg_replace_malloc.c:207)
==4956==    by 0x80486CC: AddNode (lab23_2.c:85)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956== 
==4956== Invalid read of size 4
==4956==    at 0x804893C: DeleteTree (lab23_2.c:141)
==4956==    by 0x8048B01: Delete (lab23_2.c:183)
==4956==    by 0x8048D03: main (lab23_2.c:259)
==4956==  Address 0x418e178 is 4 bytes after a block of size 4 alloc'd
==4956==    at 0x4024D0E: malloc (vg_replace_malloc.c:207)
==4956==    by 0x80486CC: AddNode (lab23_2.c:85)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956== 
==4956== Invalid read of size 4
==4956==    at 0x80489E9: DeleteTree (lab23_2.c:153)
==4956==    by 0x8048946: DeleteTree (lab23_2.c:141)
==4956==    by 0x8048B01: Delete (lab23_2.c:183)
==4956==    by 0x8048D03: main (lab23_2.c:259)
==4956==  Address 0x418e1ec is 4 bytes before a block of size 12 alloc'd
==4956==    at 0x4024D0E: malloc (vg_replace_malloc.c:207)
==4956==    by 0x804878D: AddNode (lab23_2.c:96)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956== 
==4956== Invalid read of size 4
==4956==    at 0x8048A04: DeleteTree (lab23_2.c:154)
==4956==    by 0x8048946: DeleteTree (lab23_2.c:141)
==4956==    by 0x8048B01: Delete (lab23_2.c:183)
==4956==    by 0x8048D03: main (lab23_2.c:259)
==4956==  Address 0x418e1e8 is 8 bytes before a block of size 12 alloc'd
==4956==    at 0x4024D0E: malloc (vg_replace_malloc.c:207)
==4956==    by 0x804878D: AddNode (lab23_2.c:96)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956== 
==4956== Invalid read of size 4
==4956==    at 0x8048A40: DeleteTree (lab23_2.c:161)
==4956==    by 0x8048946: DeleteTree (lab23_2.c:141)
==4956==    by 0x8048B01: Delete (lab23_2.c:183)
==4956==    by 0x8048D03: main (lab23_2.c:259)
==4956==  Address 0x418e174 is 0 bytes after a block of size 4 alloc'd
==4956==    at 0x4024D0E: malloc (vg_replace_malloc.c:207)
==4956==    by 0x80486CC: AddNode (lab23_2.c:85)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956== 
==4956== Invalid read of size 4
==4956==    at 0x8048A68: DeleteTree (lab23_2.c:163)
==4956==    by 0x8048946: DeleteTree (lab23_2.c:141)
==4956==    by 0x8048B01: Delete (lab23_2.c:183)
==4956==    by 0x8048D03: main (lab23_2.c:259)
==4956==  Address 0x418e174 is 0 bytes after a block of size 4 alloc'd
==4956==    at 0x4024D0E: malloc (vg_replace_malloc.c:207)
==4956==    by 0x80486CC: AddNode (lab23_2.c:85)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956== 
==4956== Invalid write of size 4
==4956==    at 0x8048A74: DeleteTree (lab23_2.c:164)
==4956==    by 0x8048946: DeleteTree (lab23_2.c:141)
==4956==    by 0x8048B01: Delete (lab23_2.c:183)
==4956==    by 0x8048D03: main (lab23_2.c:259)
==4956==  Address 0x418e178 is 4 bytes after a block of size 4 alloc'd
==4956==    at 0x4024D0E: malloc (vg_replace_malloc.c:207)
==4956==    by 0x80486CC: AddNode (lab23_2.c:85)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956== 
==4956== Invalid read of size 4
==4956==    at 0x8048A94: DeleteTree (lab23_2.c:168)
==4956==    by 0x8048946: DeleteTree (lab23_2.c:141)
==4956==    by 0x8048B01: Delete (lab23_2.c:183)
==4956==    by 0x8048D03: main (lab23_2.c:259)
==4956==  Address 0x418e1a4 is 4 bytes before a block of size 20 alloc'd
==4956==    at 0x4024D0E: malloc (vg_replace_malloc.c:207)
==4956==    by 0x804871E: AddNode (lab23_2.c:89)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956== 
==4956== Invalid read of size 4
==4956==    at 0x8048AAC: DeleteTree (lab23_2.c:169)
==4956==    by 0x8048946: DeleteTree (lab23_2.c:141)
==4956==    by 0x8048B01: Delete (lab23_2.c:183)
==4956==    by 0x8048D03: main (lab23_2.c:259)
==4956==  Address 0x418e1a0 is 8 bytes before a block of size 20 alloc'd
==4956==    at 0x4024D0E: malloc (vg_replace_malloc.c:207)
==4956==    by 0x804871E: AddNode (lab23_2.c:89)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956== 
==4956== Invalid read of size 4
==4956==    at 0x8048950: DeleteTree (lab23_2.c:143)
==4956==    by 0x8048B01: Delete (lab23_2.c:183)
==4956==    by 0x8048D03: main (lab23_2.c:259)
==4956==  Address 0x418e174 is 0 bytes after a block of size 4 alloc'd
==4956==    at 0x4024D0E: malloc (vg_replace_malloc.c:207)
==4956==    by 0x80486CC: AddNode (lab23_2.c:85)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956== 
==4956== Invalid read of size 4
==4956==    at 0x8048984: DeleteTree (lab23_2.c:147)
==4956==    by 0x8048B01: Delete (lab23_2.c:183)
==4956==    by 0x8048D03: main (lab23_2.c:259)
==4956==  Address 0x418e16c is 4 bytes before a block of size 4 alloc'd
==4956==    at 0x4024D0E: malloc (vg_replace_malloc.c:207)
==4956==    by 0x80486CC: AddNode (lab23_2.c:85)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956== 
==4956== Invalid read of size 4
==4956==    at 0x804899C: DeleteTree (lab23_2.c:148)
==4956==    by 0x8048B01: Delete (lab23_2.c:183)
==4956==    by 0x8048D03: main (lab23_2.c:259)
==4956==  Address 0x418e168 is 8 bytes before a block of size 4 alloc'd
==4956==    at 0x4024D0E: malloc (vg_replace_malloc.c:207)
==4956==    by 0x80486CC: AddNode (lab23_2.c:85)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956== 
==4956== Invalid read of size 4
==4956==    at 0x80489E9: DeleteTree (lab23_2.c:153)
==4956==    by 0x8048B01: Delete (lab23_2.c:183)
==4956==    by 0x8048D03: main (lab23_2.c:259)
==4956==  Address 0x418e12c is 4 bytes before a block of size 12 alloc'd
==4956==    at 0x4024D0E: malloc (vg_replace_malloc.c:207)
==4956==    by 0x804878D: AddNode (lab23_2.c:96)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956== 
==4956== Invalid read of size 4
==4956==    at 0x8048A04: DeleteTree (lab23_2.c:154)
==4956==    by 0x8048B01: Delete (lab23_2.c:183)
==4956==    by 0x8048D03: main (lab23_2.c:259)
==4956==  Address 0x418e128 is 8 bytes before a block of size 12 alloc'd
==4956==    at 0x4024D0E: malloc (vg_replace_malloc.c:207)
==4956==    by 0x804878D: AddNode (lab23_2.c:96)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956== 
==4956== Invalid read of size 4
==4956==    at 0x8048A40: DeleteTree (lab23_2.c:161)
==4956==    by 0x8048B01: Delete (lab23_2.c:183)
==4956==    by 0x8048D03: main (lab23_2.c:259)
==4956==  Address 0x418e0b4 is 0 bytes after a block of size 4 alloc'd
==4956==    at 0x4024D0E: malloc (vg_replace_malloc.c:207)
==4956==    by 0x80486CC: AddNode (lab23_2.c:85)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956== 
==4956== Invalid read of size 4
==4956==    at 0x8048A68: DeleteTree (lab23_2.c:163)
==4956==    by 0x8048B01: Delete (lab23_2.c:183)
==4956==    by 0x8048D03: main (lab23_2.c:259)
==4956==  Address 0x418e0b4 is 0 bytes after a block of size 4 alloc'd
==4956==    at 0x4024D0E: malloc (vg_replace_malloc.c:207)
==4956==    by 0x80486CC: AddNode (lab23_2.c:85)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956== 
==4956== Invalid write of size 4
==4956==    at 0x8048A74: DeleteTree (lab23_2.c:164)
==4956==    by 0x8048B01: Delete (lab23_2.c:183)
==4956==    by 0x8048D03: main (lab23_2.c:259)
==4956==  Address 0x418e0b8 is 4 bytes after a block of size 4 alloc'd
==4956==    at 0x4024D0E: malloc (vg_replace_malloc.c:207)
==4956==    by 0x80486CC: AddNode (lab23_2.c:85)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956== 
==4956== Invalid read of size 4
==4956==    at 0x8048A94: DeleteTree (lab23_2.c:168)
==4956==    by 0x8048B01: Delete (lab23_2.c:183)
==4956==    by 0x8048D03: main (lab23_2.c:259)
==4956==  Address 0x418e0e4 is 4 bytes before a block of size 20 alloc'd
==4956==    at 0x4024D0E: malloc (vg_replace_malloc.c:207)
==4956==    by 0x804871E: AddNode (lab23_2.c:89)
==4956==    by 0x8048CD7: main (lab23_2.c:257)
==4956== 
==4956== Invalid read of size 4
==4956==    at 0x8048AAC: DeleteTree (lab23_2.c:169)
==4956==    by 0x8048B01: Delete (lab23_2.c:183)
==4956==    by 0x8048D03: main (lab23_2.c:259)
==4956==  Address 0x418e0e0 is 8 bytes before a block of size 20 alloc'd
==4956==    at 0x4024D0E: malloc (vg_replace_malloc.c:207)
==4956==    by 0x804871E: AddNode (lab23_2.c:89)
==4956==    by 0x8048CD7: main (lab23_2.c:257)


вот код с выводом на экран всех адресов при выделении\освобождении памяти:

Код

#include <stdio.h>
#include <string.h>
#include <malloc.h>

struct Node;

struct ChildNode{
        struct ChildNode *prev;
        struct ChildNode *next;
        struct Node *element;
};
typedef struct ChildNode childnode;

struct Node{
        int index;
        double value;
        childnode *parent;
        childnode *children;
};
typedef struct Node node;

struct List{
        int count;
        struct List *prev;
};
typedef struct List list;

node *first;
int count = 0;

node *GetElementByIndex(int index, node *t)
{
        node *temp = NULL;
        childnode *c;

        if (t==NULL)
               return NULL;
        if (t->index==index)
                return t;
        c=t->children->next;
        if (c==NULL)
                return NULL;
        while (c!=NULL)
        {
                temp=GetElementByIndex(index,c->element);
                if (temp!=NULL)
                        break;
                c=c->next;
        }
        if (temp!=NULL)
                return temp;
        return NULL;
}

int AddNode(int index, double value)
{
        node *t, *temp;
        childnode *c, *child;

        if (first==NULL)
        {
                temp = (node *)malloc(sizeof(node));
printf ("temp malloc res=%p\n", temp);
printf ("res[-1]=0x%08x\n", *(((int*)temp)-1));
printf ("res[-2]=0x%08x\n", *(((int*)temp)-2));
                temp->value = value;
                temp->index = 1;
                temp->children = (childnode*)malloc(sizeof(childnode));
printf ("temp->children malloc res=%p\n", temp->children);
printf ("res[-1]=0x%08x\n", *(((int*)temp->children)-1));
printf ("res[-2]=0x%08x\n", *(((int*)temp->children)-2));
                temp->children->prev = NULL;
                temp->children->next = NULL;
                temp->children->element = NULL;
                first=temp;
                count=1;
                return 0;
        }
       
        t = GetElementByIndex(index,first);
        if (t==NULL)
                return -1;

        ++count;
        child = (childnode*)malloc(sizeof(child));
        printf ("child malloc res=%p\n", child);
printf ("res[-1]=0x%08x\n", *(((int*)child)-1));
printf ("res[-2]=0x%08x\n", *(((int*)child)-2));
        temp = (node *)malloc(sizeof(node));
printf ("temp malloc res=%p\n", temp);
printf ("res[-1]=0x%08x\n", *(((int*)temp)-1));
printf ("res[-2]=0x%08x\n", *(((int*)temp)-2));
        temp->value = value;
        temp->index = count;
        temp->parent = child;
        temp->children = (childnode*)malloc(sizeof(childnode));
printf (" temp->children malloc res=%p\n",  temp->children);
printf ("res[-1]=0x%08x\n", *(((int*)temp->children)-1));
printf ("res[-2]=0x%08x\n", *(((int*)temp->children)-2));
        temp->children->prev = NULL;
        temp->children->next = NULL;
        temp->children->element = NULL;
        child->next = NULL;
        child->element = temp;
        c=t->children;
        while (c->next!=NULL)
                c=c->next;
        child->prev = c;
        c->next = child;
        return 0;
}

void PrintTree(const char *str, node *p)
{
        childnode *c;
        char temp[50];

        if (p==NULL)
                return;
        printf("%s%i: %0.2f\n",str,p->index,p->value);
        if (p->children->next==NULL)
                return;
        strcpy(temp,str);
        strcat(temp,"\t\0");
        c=p->children->next;
        while (c!=NULL)
        {
                PrintTree(temp,c->element);
                c=c->next;
        }
        return;
}

void DeleteTree(node *p)
{
        childnode *c, *cTemp;
printf("index: %i\n",p->index);        
        c=p->children->next;
        while (c!=NULL)
        {
                DeleteTree(c->element);
                cTemp = c;
                c = c->next;

                printf ("obrshenie %p\n", cTemp->prev);
printf ("free %p\n", cTemp);
printf ("free[-1]=0x%08x\n", *(((int*)cTemp)-1));
printf ("free[-2]=0x%08x\n", *(((int*)cTemp)-2));
                free(cTemp);                                
                cTemp = NULL;
        }
        printf ("p->children free %p\n", p->children);
printf ("free[-1]=0x%08x\n", *(((int*)p->children)-1));
printf ("free[-2]=0x%08x\n", *(((int*)p->children)-2));

        free(p->children);
        if (first==p)
                first = NULL;
        else
        {
                if (p->parent->next!=NULL)
                        p->parent->next->prev = p->parent->prev;
                p->parent->prev->next = p->parent->next;
        p->parent->element=NULL;
        }
        
    printf ("p free %p\n", p);
printf ("free[-1]=0x%08x\n", *(((int*)p)-1));
printf ("free[-2]=0x%08x\n", *(((int*)p)-2));

        free(p);
}

void Delete(int index)
{
        node *t;

        if (first==NULL)
                return;
        t = GetElementByIndex(index,first);
        if (t==NULL)
                return;
        DeleteTree(t);
        return;
}

void task(node *p, list **l, int *cnt)
{
        int count = 0;
        list *t = (list*)malloc(sizeof(list));
        childnode *c;

        if (p==NULL)
                return;

        c = p->children->next;
        while (c!=NULL)
        {
                ++count;
                task(c->element,l, cnt);
                c=c->next;
        }
        t->count = count;
        if (count>*cnt)
                *cnt = count;
        if ((*l)==NULL)
        {
                t->prev = NULL;
                (*l)=t;
                return;
        }
        t->prev = (*l);
        (*l)=t;

        return;
}

int Count(list *l, int cnt)
{
        int c = 0;
        list *t;

        if (l==NULL)
                return 0;
        while (l->prev != NULL)
        {
                if (l->count == cnt)
                        ++c;
                t = l;
                l = l->prev;
                free(t);
                t = NULL;
        }
        if (l->count == cnt)
                ++c;
        free(l);
        return c;
}

int main()
{
        char c;
        int index, cnt;
        double value;
        list *l = NULL;

        cnt = 0;

        do
        {
                c = getchar();
                switch(c)
                {
                        case '1':
                                PrintTree("", first); break;
                        case '2':
                                printf("Input index and value to input: "); scanf("%i%le",&index,&value); AddNode(index,value); break;
                        case '3':
                                printf("Input index to delete"); scanf("%i",&index); Delete(index); break;
                        case '4':
                                l = NULL; cnt=0; task(first,&l,&cnt); printf("Number: %i\n",Count(l, cnt)); break;
                }
        } while (c!='5');
}


ошибки чтения памяти получаются из-за printf'оф, а вот откуда ошибки записи не пойму.

Это сообщение отредактировал(а) Pori - 25.5.2009, 00:18
PM MAIL   Вверх
xvr
Дата 25.5.2009, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Он же написал - из за строки 85. Там
Код

        child = (childnode*)malloc(sizeof(child));
а должно быть
Код

        child = (childnode*)malloc(sizeof(childnode));
или так (если уж до зарезу надо через child)
Код

        child = (childnode*)malloc(sizeof(*child));

PM MAIL   Вверх
Pori
Дата 25.5.2009, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 10.9.2007

Репутация: нет
Всего: 1



Цитата(xvr @ 25.5.2009,  15:51)
Он же написал - из за строки 85. Там
Код

        child = (childnode*)malloc(sizeof(child));
а должно быть
Код

        child = (childnode*)malloc(sizeof(childnode));
или так (если уж до зарезу надо через child)
Код

        child = (childnode*)malloc(sizeof(*child));

Спасибо огромное =) Не заметил такую глупость, когда переписывал со старой версии. Еще раз спасибо ;) Сутки искал ошибку ;)
PM MAIL   Вверх
MAKCim
Дата 26.5.2009, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



кстати говоря, ошибки такого рода крайне трудно найти самому без помощи коллег и спец. тулзов
глаз замыливается и тупо не видишь очевидное

под борландом оно работало, видно, из-за того, что тамошний аллокатор выделяет больше памяти, чем требуется, из-за чего баг себя не проявлял


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Static
Дата 27.5.2009, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 6.11.2008

Репутация: 1
Всего: 2



Цитата(MAKCim @  26.5.2009,  09:21 Найти цитируемый пост)
под борландом оно работало, видно, из-за того, что тамошний аллокатор выделяет больше памяти, чем требуется, из-за чего баг себя не проявлял

Это что - правда так?..  smile т.е. он выделяет не столько, сколько просят, а столько - сколько он думает, что надо выделить?

--------------------
Я не настолько безнадежен, как кажется...
PM MAIL   Вверх
azesmcar
Дата 27.5.2009, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(Static @  27.5.2009,  16:11 Найти цитируемый пост)
Это что - правда так?..  smile т.е. он выделяет не столько, сколько просят, а столько - сколько он думает, что надо выделить?

Да.
malloc гарантировано возвращает минимум столько - сколько вы запросили, либо возвращает NULL.
PM   Вверх
Alca
Дата 27.5.2009, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



а Valgrind  под винду есть?


--------------------
PM WWW ICQ Skype Jabber   Вверх
azesmcar
Дата 27.5.2009, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(Alca @  27.5.2009,  17:01 Найти цитируемый пост)
а Valgrind  под винду есть? 

нет, но полно аналогов.

* Purify
* Insure++
хотя надо признать в отличии от Valgrind они платные.
еще может пригодиться pageheap.exe

Это сообщение отредактировал(а) azesmcar - 27.5.2009, 17:18
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0597 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.