Сжать int массив C
только начал изучать C и наткнулся на следующую проблему:
Мне нужно сжать целочисленный массив в C, удалив элементы в конце. Под удалением я подразумеваю освобождение. Общий ответ-выделить новую память для меньшего массива, после чего скопировать все элементы (- элементы для удаления ) исходного массива во вновь выделенную память, а затем освободить () исходный массив.
потому что я должен иметь дело с очень большие массивы, я бы предпочел пропустить копировать часть.
можно ли создать переменную указателя, которая указывает на "ближе к концу исходного массива "размера" конец массива - ближе к концу", а затем освободить этот указатель?
спасибо заранее
4 ответов
на realloc функция из стандартной библиотеки C может быть то, что вы хотите.
в вашем случае он, скорее всего, не будет выполнять операцию копирования, потому что у менеджера памяти нет причин выделять новую зону памяти. Только разница между старым и новым размером может быть восстановлены системой в качестве доступной памяти.
копировать произойдет в случае, если вы сделаете свой массив больше, потому что malloc и друзья не гарантируют, что память после "текущей" зоны фактически свободна. Если это так, то все в порядке, текущее распределение памяти будет расширено. Если нет, необходимо найти большую доступную зону памяти, и ее можно выделить практически в любом месте памяти.
вы думали об использовании realloc
?
int main(void)
{
int *array = NULL, *tmp;
if(!(array = malloc(5 * sizeof(int)))) return 1;
if(!(tmp = realloc(array, 2*sizeof(int))))
{
free(array);
return 1;
}
array = tmp;
}
вы можете сделать это без tmp
указатель и просто array = realloc(array, 2*sizeof(int))))
но это может привести к проблемам в будущем.
можно создать менеджер памяти, который сделает это возможным, но ни один из часто используемых менеджеров памяти не имеет этого свойства. Вы можете написать свой собственный mm и использовать его для этих массивов.
Я хотел бы использовать realloc. Realloc может копировать память, но это все равно может быть более эффективным, чем сворачивание собственного управления памятью для борьбы с проблемой копирования.
некоторые скажут вам, что никакая приличная библиотека C не будет копировать, когда результирующий размер меньше. Возможно, они правы. Однако я не использую и не пишу коммерческие библиотеки C, так что, насколько мне известно, это утверждение необоснованно.