LINUX.ORG.RU

strndup && free


0

0

Глупый, наверное, вопрос, но как проследить, чтобы strndup потом все освобождались?
Правильно ли следующее (в комментариях написано, как было до strndup):
quicksort(char **strings, int n)
{
int i = 1, last = 0;
char *s, *t;
//char s[MAXCHARSINLINE], t[MAXCHARSINLINE];

if (n <= 1) // Ничего не делать
return;
swap(strings, 0, rand() % n);
s = strndup(strings[0]+posofword, wordlen);
//strncpy(s, strings[0]+posofword, wordlen);
//s[wordlen] = '\0';
for (i = 1; i <= n; i++) { // Разделить
t = strndup(strings[i]+posofword, wordlen);
//strncpy(t, strings[i]+posofword, wordlen);
//t[wordlen] = '\0';
if (strcmp(t, s) < 0) {
swap(strings, ++last, i);
}
}
swap(strings, 0, last);
quicksort(strings, last); // Рекурсивно отсортировать
quicksort(strings+last+1, n-last-1); // каждую часть
free(s); s = NULL;
free(t); t = NULL;
}

★★★★★

Хм, почему строки создаются в цикле, а освобождаются только после цикла? Есс-но тут будет утечка. Вообще не совсем понятно в чем смысл данного фрагмента. Проще написать правильный компаратор и подсунуть его qsort. В любом случае, быстрая сортировка _не требует_ выделения памяти в принципе, посмотрите "референсную" реализацию на псевдокоде.

phoenix ★★★★
()
Ответ на: комментарий от phoenix

> Проще написать правильный компаратор и подсунуть его qsort
Это ты чё имел ввиду?
> Хм, почему строки создаются в цикле, а освобождаются только после цикла?
Я просто не знаю, а если strndup используется уже с инициализированным указателем, то выделение производится ещё раз?
Так может проще сделать как было (с использованием strncpy) или что вы имели ввиду про qsort

UVV ★★★★★
() автор топика
Ответ на: комментарий от UVV

>Это ты чё имел ввиду?
Это я имел ввиду нечто следующее:
------------
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int cmp(const void* left, const void* right)
{
        const char* l = *(char**)left;
        const char* r = *(char**)right;
        return strcmp(l,r);
}

int main()
{
        const char* testdata[] = {"abc", "123", "321", "bcd", "zxy"};
        int n = sizeof(testdata)/sizeof(testdata[0]);
        int i;
        qsort(testdata, n, sizeof(const char*), cmp);
        for (i = 0; i < n; ++i)
                puts(testdata[i]);
        return 0;
}
----------------
> Я просто не знаю, а если strndup используется уже с инициализированным указателем, то выделение производится ещё раз? 
man strndup ;)

Тут весь вопрос в целях. С чисто практической т.з. qsort рулит, в академических целях можно ковырять приведенный тобой код.

phoenix ★★★★
()
Ответ на: комментарий от phoenix

> Тут весь вопрос в целях. С чисто практической т.з. qsort рулит, в академических целях можно ковырять приведенный тобой код.
Цель приблизительно такая (поэтому я и переписал qsort):
Есть массив строк!
Задаётся позиция начала слова и его длина. (для всех строк эти параметры одинаковы)
Строки будут сортироваться по этим словам.
Первоначально я делал ещё один массив для сортировки, но проще (imho) выцеплять слово напрямую из строки а после сравнения действия производить не со словами, а со строками!
Доходчиво объяснил?

UVV ★★★★★
() автор топика
Ответ на: комментарий от UVV

Т.е. сравнение идет не по всей строке, а по некоторой подстроке фиксированной длины, которая начинается с определенной позиции?
---
int cmp(const void* left, const void* right)
{
const char* l = *(char**)left;
const char* r = *(char**)right;
if ( strlen(l) >= START_POS )
l += START_POS
if ( strlen(r) >= START_POS )
r += START_POS
return strncmp(l, r, SUBSTR_LENGTH);
}
---
Нужно отдельное внимание уделить случаю, когда сравниваемая подстрока отсутствует (исходная строка короткая).
Данная реализация такие строки будет сравнивать с начала.

phoenix ★★★★
()
Ответ на: комментарий от phoenix

Спасибо за подсказку - дальше буду курить man qsort и man bsearch

UVV ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.