Сжать 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, так что, насколько мне известно, это утверждение необоснованно.