>>а вы правильно опишите проблему
>>разбирать ваш код это дорого
>
>
>Эээ. Ну вот, простейший пример..
>значит так.
>
>include...
>
по моему, как раз никакой проблемы.
char **foo(char *s) {
char **pbuf = NULL;
char **pp;
char **end;
char *p;
int size = DEFAULT_SIZE;
if ((pbuf = malloc(sizeof(char *)*size)) == NULL) {
//printf("FUCK\n");
return NULL;
}
for (p = s, pp = pbuf, end = pbuf + size;;) {
if (isspace(*p) || *p == '\0') {
endpointer:
if (pp >= end) {
size *= 2;
if ((pp = realloc(pbuf, sizeof(*pbuf)*size)) == NULL) {
//printf("REALLY FUCK\n");
free(pbuf);
return NULL;
}
pbuf = pp;
pp = pbuf + size/2;
end = pbuf + size;
}
*pp++ = s; // или *pp++ = strdup(s);
if (*p == '\0') {
if (s == NULL)
break;
s = NULL;
goto endpointer;
}
*p = '\0';
#if 1
while (isspace(*(s = ++p));
#else
// если столбец - строго один пробел или \n или \r или еще какой символ, то:
s = ++p;
#endif
} else
++p;
}
return pbuf;
}
Надеюсь понятно что к чему. Ошибки ищи сам :)
Если не используется strdup - то высвободить нужно только один указатель.
Если изменять нельзя строку, например, когда она вкомпилированна в код, или используется в том же виде для обработчиков, то её перед этим надо скопировать (той же strdup).
>Не судите строго, так, от руки накидал чтоб сама фишка была видна.
>Вот такой код дает постоянное выделение памяти calloc'ом, но читить то
>мне его негде... Дело в том, что эта функция в дальнейшем
>будет использоваться еще во многих задачках, и смотреть размер возвращенного массива
>а потом в цикле делать free - это не выход..
>Как бы избежать утечки?
Есть еще один простой ответ на этот вопрос. Написать функцию для высвыбождения именно этого результата, и пользоваться ей, взамен простого вызова free.