Удаление динамически распределенных членов массива в C - PullRequest
1 голос
/ 06 апреля 2011

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

Этот массив динамически выделяется с помощью malloc, я сохраняю количество элементов вотдельная переменная.

Как мне удалить запись?

Я думаю о

for (i = pos; i < arr_len; i++) {
  arr[i] = arr[i+1];
}
arr_len--;

Но это оставляет тот же объем памяти для массива, покаНа самом деле мне нужно меньше и последняя запись (как бы).

Является ли выдача realloc в такой ситуации общепринятой практикой?Будет ли realloc делать memcpy в этом случае?(сокращение выделенной памяти на один блок).

Ответы [ 3 ]

4 голосов
/ 06 апреля 2011

realloc в порядке ... но продолжайте читать:)

realloc не будет перемещать части памяти; это может переместить весь блок. Поэтому вам необходимо скопировать данные перед изменением выделенного размера.

Чтобы переместить данные, memmove (не memcpy) - хороший вариант: он работает для областей памяти, которые принадлежат одному и тому же объекту. Обратите внимание, чтобы не выходить за пределы вашего массива, хотя; как вы делаете в своем коде.

for (i = pos; i < arr_len; i++) {
  arr[i] = arr[i+1];
}

arr[i] = arr[i + 1]; попытается получить доступ к значению, превышающему допустимый. Вам нужно

for (i = pos + 1; i < arr_len; i++) {
  arr[i - 1] = arr[i];
}

При вызове realloc возникают некоторые накладные расходы. Если ваши структуры невелики и / или они живут только в течение короткого времени, рассмотрите возможность сохранения количества элементов и выделенного количества, а также только realloc для увеличения (когда (element_count + 1) > (allocated_count)).


Если структура большая, также рассмотрим другую структуру данных (возможно, связанный список).

1 голос
/ 06 апреля 2011

Вызов realloc для сокращения выделенной памяти не обязательно будет плохой идеей.

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

0 голосов
/ 06 апреля 2011

Использование realloc было бы уместным здесь.Это не сделало бы memcpy - это необходимо, только когда размер realloc больше, и нет места для расширения.

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