Для начала: вы используете со знаком int для индексов и num.Тогда входной сигнал может быть отрицательным (!), Поэтому вам придется проверить.Вы избежите этой проблемы, если используете типы unsigned (особенно, поскольку отрицательные индексы и длины массивов в любом случае не имеют смысла).Лично я бы использовал size_t
для.
Немного сократил ваш код:
free(mens[index]->userName);
// ...
for (f = index; f < *numMens - 1; f++)
{
mens[f]->age = mens[f + 1]->age;
// ...
}
// these are wrong: you moved them to preceeding list element already
// (unless it was the last element itself, but then you freed them directly
// before entering the loop)
free(mens[*numMens - 1]->description);
// but I assume you instead want to delete the last element instead:
free(mens[*numMens - 1]);
Вы можете упростить эту часть, хотя:
free(mens[index]->userName);
// ...
free(mens[index]);
for (f = index; f < *numMens - 1; f++)
{
mens[f] = mens[f + 1];
}
-alloc часть сомнительна, хотя:
- результат прохождения нулевого размера равен определена реализация - вы можете получить или не получить нулевой указатель, память может илине может быть освобожден.
- Начиная с C11, поддержка нулевого размера устарела.
Уменьшение размера памяти может заставить пользователя функции перейти на новый realloc
, как только онаили он добавляет другой элемент в массив, который может быть не в ее / ее пользу ...
Моя личная рекомендация:
typedef struct
{
size_t size;
size_t capacity;
user_** data; // maybe even better: user_* data??? - depends on use case, though
} List;
Эта структура объединяет все соответствующие данные в одном месте, если вы используете его для своих функций вставки / удаления, вам лучше.Вы бы увеличили объем памяти, если бы ее не хватало, но оставили бы сокращение для пользователя (хотя, возможно, для удобства у вас есть отдельная функция).
Если вы чувствуете, что напомнили C ++: Да, основная идея украденаоттуда (std::vector
) ...