Всем привет. реализую некое подобие 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 в отдельный файл и запихнул так же исходник с тестовым примером где проявляется ошибка (только пути к файлам исходников обработчиков поправьте, чтобы собралось). Буду благодарен за наводку.