Рекурсивный метод realloc () выдает & ldquo; неверный следующий размер & rdquo; после 7-го цикла

Если вам нужно отсортировать только одно поле, тогда usort - хороший выбор. Однако решение быстро становится беспорядочным, если вам нужно сортировать по нескольким полям. В этом случае можно использовать библиотеку YaLinqo *, которая реализует синтаксис SQL-подобных запросов для массивов и объектов. Он имеет довольно синтаксис для всех случаев:

$sortedByName         = from($objects)->orderBy('$v->name');
$sortedByCount        = from($objects)->orderBy('$v->count');
$sortedByCountAndName = from($objects)->orderBy('$v->count')->thenBy('$v->name');

Здесь '$v->count' является сокращением для function ($v) { return $v->count; } (либо можно использовать). Эти цепочки методов возвращают итераторы, но вы можете получить массивы, добавив ->toArray() в конце, если вам это нужно.

*, разработанный мной

2
задан dbush 16 January 2019 в 14:31
поделиться

2 ответа

Вы не перераспределяете достаточно памяти:

array = (int*) realloc (array, lastIndex * sizeof(int));

На первой итерации цикла значение lastIndex увеличивается с 0 до 1, затем вы запускаете вышеуказанный вызов realloc. Поскольку lastIndex равно 1, у вас все еще достаточно места для 1 элемента. В результате вы пишете после окончания выделенной памяти на следующей итерации.

Это вызывает неопределенное поведение , которое в вашем случае проявляется в том, что оно работает должным образом в течение первых 6 итераций и заканчивается 7-м. Он мог так же легко разбиться на первой или второй итерации.

Добавьте единицу к размеру, который вы выделяете:

array = realloc(array, (lastIndex + 1) * sizeof(int));

Кроме того, не приводят возвращаемое значение malloc / realloc .

0
ответ дан dbush 16 January 2019 в 14:31
поделиться

Исправьте realloc:

array = (int*) realloc (array, (lastIndex + 1) * sizeof(int))

Вы выделяете на один предмет меньше, чем нужно.

0
ответ дан grapes 16 January 2019 в 14:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: