Проблема в урезании массива c - PullRequest
0 голосов
/ 16 июня 2011

Я объявил массив и беру ввод от пользователя.Теперь я хочу проверить дубликаты записей, они должны быть удалены и память должна быть освобождена.Возможно ли освободить память.

освобождение неиспользуемой памяти и уменьшение размера массива?

Я ввел [10,21,3,4,4,2,6,7,21,4,10]. Это должно быть усечено до [10,21,3,4,2,6,7], а длина массива теперь должна быть 7, и я не хочу использовать сортировку.

Ответы [ 4 ]

4 голосов
/ 16 июня 2011

В C вы не можете изменить размер массива. Если вы используете динамически распределенную память (с malloc()), вы можете использовать realloc(), чтобы изменить размер области памяти или выделить новую область, скопировать в нее данные и освободить старую.

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

2 голосов
/ 16 июня 2011

Простая реализация:

  1. Когда вы найдете дубликат записи, перетасуйте массив влево, чтобы заполнить пробел (закрывая дубликат).
  2. Используйте realloc, чтобы уменьшитьВыделение.

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

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

1 голос
/ 16 июня 2011

Я объявил массив длиной 100 и принял данные от пользователя

, поэтому вы имеете в виду следующее:

    int input[100];
/* - ask 100 input from user */

Возможно ли освободитьпамять

ответ - нет, потому что вы статически выделяете 100 целых чисел.

Если вы хотите уменьшить объем памяти, вам нужно сделать что-то вроде этого:

int *tempBuffer=malloc(100*sizeof(int)); /* dynamic allocation */

for(i=0;i<100;++i) scanf("%d",&tempBuffer[i]);/* - ask 100 input from user */

int uniqueN=10   /* - assume the first 10 entries are the unique entries */

int *realBuffer=malloc(uniqueN*sizeof(int)); /* - allocate new buffer just enough for the unique entries */

for(i=0;i<uniqueN;++i) realBuffer[i]=tempBuffer[i];  /* - copy the unique entries from input to the final buffer */

free(tempBuffer);  /* - tempBuffer is now unused, free it */

/* here we have realBuffer with just enough size, no unused memory */

Другое решение состоит в том, чтобы realloc tempBuffer после того, как первые uniqueN записи будут уникальными:

realloc(tempBuffer,uniqueN);

, не забудьте проверить, malloc или reallocвозвращает NULL

0 голосов
/ 16 июня 2011

Массивы не являются динамическими в C. Тем не менее, вы можете получить доступ к записям за пределами последней (учитывая, что переменная массива по сути является указателем). Тем не менее, это не безопасно.

Кроме того, вы не можете удалить «записи массива». Вы можете переместить остальные элементы, чтобы занять соответственно предыдущие позиции. Однако на самом деле вы не можете удалить область, занятую элементом, так как массив является непрерывной частью памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...