Здравствуйте, watchmaker, Вы писали:
O>Хотел думать что проблема с выделением нового блока памяти, но в таких случаях обычно выдается segfault. В чем именно проблема может быть еще -я пока что понять не могу.
Проблема в том, что ты записываешь свои данные в область памяти, которую ты не выделял. Ну а вскрывается это не сразу, а собственно при других операциях с памятью, вроде того же вызова realloc.
Ну как же не выделял если я ее тем же самым realloc выделяю для записи этой строки? Если не сложно- можно более подробно? пока что не понятно где я с выделением памяти просчитался?
Вот здесь:
else
{
if (i==2)
map.value=(char **)malloc(sizeof(char *)*j+1);
else
map.value=(char **)realloc(map.value,sizeof(char*)*j+1);
Если я встречаю первое значение для value я выделяю память через valloc для элемента массива, если же у меня знчение отличное от первого, значит я могу утверждать что память уже выделена и остается только ее расширить на необходимое количество байт.
Не понимаю пока что что не так в этом куске?
W>Попробуй для начала его разбить на функции, убрать копипасту, дать переменным нормальные имена, а не безликие i/j/k.
Ок. Принято
W>Вот, например, если смотреть на имена, то почему у тебя j хранит длину строки в одном месте: int j=strlen(arr->substrings[i-1]);, а в другим месте — используется для определения длины массива указателей, которые ссылаются на эти строки: map.name=(char **)malloc(sizeof(char *)*j+1); ?
Потому что выделяемая область памяти зависит от размера строки, который в свою очередь хранит переменная j
O>>На всякий случай положил исходники самих обработчиков MAPPER и SPLITTER в отдельный файл и запихнул так же исходник с тестовым примером где проявляется ошибка
W>Молодец. Пусть там и лежат. Больше их не трогай, а возьми GLib
GLib не тяжеловата для таких, в общем то не сильно затратных операций? Может есть аналоги поменьше?