Почему происходит сбой свободной функции после использования qsort в выделенной памяти? - PullRequest
1 голос
/ 16 июня 2019

Я выделяю память для строки, используя malloc, затем выполняю qsort над этой памятью, сортируя символы строки.

Я выполняю qsort несколько раз, копируя новые значения в выделенную память каждый раз.

После этого я пытаюсь free памяти, но она вылетает

Не произойдет сбой, если я прокомментирую qsort строку

/**
 * Iterates over b finding permutations of s
 *
 * @param s smaller string
 * @param b bigger string
 * @param locations array for the result
 * @return number of locations
 */
int substring_permutations(const char *s, const char *b, int *locations) {
    int s_len = (int) strlen(s);

    char *sorted_sub_b = malloc((s_len + 1) * sizeof(char));
    sorted_sub_b[s_len] = '\0';

    char *sorted_s = malloc((s_len + 1) * sizeof(char));
    sorted_s[s_len] = '\0';
    sort_string(s, s_len, sorted_s);

    int l = 0;
    for (int i = 0; i < strlen(b) - s_len + 1; i++) {
        sort_string(b + i, s_len, sorted_sub_b);

        if (strcmp(sorted_s, sorted_sub_b) == 0) {
            locations[l++] = i;
        }
    }

    free(sorted_s);
    free(sorted_sub_b); // Why does this crash?
    return l;
}

void sort_string(const char *s, int s_len, char *sorted_s) {
    memcpy(sorted_s, s, s_len * sizeof(char));
    qsort(sorted_s, s_len * sizeof(char), sizeof(char), chrcmp);
}

int chrcmp(const void *a, const void *b) {
    return *(char *) a - *(char *) b;
}

Вылетает при выполнении второго free

Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)

РЕДАКТИРОВАТЬ : добавление кода вызова


int main() {
    const char *s = "abbc";
    const char *b = "cbabadcbbabbcbabaabccbabc";

    printf("%s\n", s);
    printf("%s\n", b);

    size_t s_len = strlen(s);
    size_t b_len = strlen(b);
    int *locations = malloc((b_len + 1 - s_len) * sizeof(char));

    int permutations = substring_permutations(s, b, locations);

    for (int i = 0; i < permutations; i++) {
        int location = locations[i];
        printf("%d ", location);
        print_chars(b + location, s_len);
        printf("\n");
    }

    free(locations);

    return 0;
}

void print_chars(const char *c, size_t size) {
    for (int i = 0; i < size; i++) {
        printf("%c", c[i]);
    }
}

РЕДАКТИРОВАТЬ 2 : Теперь я вижу проблему, она была в коде вызова:

у меня было

    int *locations = malloc((b_len + 1 - s_len) * sizeof(char));

вместо

    int *locations = malloc((b_len + 1 - s_len) * sizeof(int));

Спасибо @ user5329483

...