invalid fastbin entry (free):
От: Ovoshlook  
Дата: 17.04.14 12:10
Оценка: :)
Всем привет. реализую некое подобие MAP для C. С динамическим выделением памяти под поля name и value.

В общем случае MAPPER это структура котороая имеет следующий вид:


typedef struct
        {
                int colls_num; //number of MAPPING strings
                char **name;  //number of substrings
                char **value;      //substring values array
        }MAPPER;


То есть в заполненном виде вывод структуры может иметь вид:


colls_num: 2

name: name1 value: value1
name: name2 value: value2


Заполнение данной структуры происходит через специальный метод. который так же реализован чрез структуру SPLITTER, но это не суть важно. Метод проверен, отрабатывает верно и чисто. Для ясности приведу пример SPLITTER структуры



typedef struct
        {
                int colls_num;  //number of substrings
                char **substrings;      //substring values array
        }SPLITTER;




Исходный код формирования структуры MAPPER вот такой (printf для теста. можно не обращать внимание):





MAPPER MAP_string(SPLITTER *arr)
{
        MAPPER map;

        int i=0;

        int k=0;

        for (i=1;i<=arr->colls_num;i++)
        {
                //int j=0;

                //while (arr->substrings[i-1][j]!='\0') j++;
                int j=strlen(arr->substrings[i-1]);

                if ((i+1)%2 == 0)
                {

                        if (i==1)

                                map.name=(char **)malloc(sizeof(char *)*j+1);

                        else

                                map.name=(char **)realloc(map.name,sizeof(char*)*j+1);

                        printf("i='%u'\n",i);
                        printf("k='%u'\n",k);
                        map.name[k]=arr->substrings[i-1];
                        printf("name %u %s\n",k,map.name[k]);

                }
                else

                {
                        if (i==2)

                                map.value=(char **)malloc(sizeof(char *)*j+1);

                        else

                                map.value=(char **)realloc(map.value,sizeof(char*)*j+1);

                        printf("i='%u'\n",i);
                        printf("k='%u'\n",k);
                        map.value[k]=arr->substrings[i-1];
                        printf("value %u %s\n",k,map.value[k]);


                        k++;

                }
        }

map.colls_num=k++;
printf("%u\n",arr->colls_num);
printf("%u\n",map.colls_num);
printf("%s\n",map.value[0]);


return map;

}


Так вот. Суть в том, что при формировании структуры MAPPER на этапе формирования последнего value (то есть если всего у нас 4 элемента ИМЯ/ЗНАЧЕНИЕ ) возникает ошибка invalid fastbin entry (free): 0x0000000000c350f0 ***


То есть имя для 4 элемента формируется а значение нет.

Косяк где то вот тут:


else

                {
                        if (i==2)

                                map.value=(char **)malloc(sizeof(char *)*j+1);

                        else

                                map.value=(char **)realloc(map.value,sizeof(char*)*j+1);


Хотел думать что проблема с выделением нового блока памяти, но в таких случаях обычно выдается segfault. В чем именно проблема может быть еще -я пока что понять не могу.
На всякий случай положил исходники самих обработчиков MAPPER и SPLITTER в отдельный файл и запихнул так же исходник с тестовым примером где проявляется ошибка (только пути к файлам исходников обработчиков поправьте, чтобы собралось). Буду благодарен за наводку.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.