2013-05-22 3 views
5

Я пытаюсь увеличить размер массива динамически. Есть ли какая-либо стандартная функция C или C++, которая добавляет дополнительное пространство в конце массива или удаляет его? Я знаю, это сложно, так как не может быть уверен, что в куче хватает места в конце. Но разве это не должно быть операционная система?Динамически увеличивать/уменьшать размер массива

+1

['void * realloc (void * ptr, size_t size);'] (http://www.cplusplus.com/reference/cstdlib/realloc/) function in C –

+2

Вам нужно решить, как на каком языке вы программируете. В C вы должны использовать 'realloc'. В C++ вы будете использовать 'std :: vector'. –

ответ

5

Функция вы ищете в C, который также присутствует в C++ STL как std::realloc

Хотя, как вы упомянули C++ realloc(), вы могли бы также пойти для стандартного контейнера, как std::vector, который инкапсулирует связанный управление памятью.

+0

размер не убывает, ** ** ** –

+0

ну, он уменьшается, если я введу меньший размер, чем раньше. Или это невозможно? –

+1

@GrijeshChauhan Вы можете указать новый размер, меньший размеру старого массива. Стандарт C указывает (7.20.3.4), что 'realloc()' "освобождает старый объект, на который указывает ptr, и возвращает указатель на новый объект с размером, указанным по размеру", и что содержимое нового объекта является то же самое до min (oldSize, newSize). – JBL

0

Не существует C-функций как таковых. вы можете пойти на контейнер C++. У этого есть Массивы, списки и т. Д.

0

возможно, вы можете добиться этого, написав свою собственную оболочку управления памятью, чтобы добавить/освободить куски памяти из выделенного массива.

0

После много экспериментов, таких как профессора и инженеры (которые имеют реальные рабочие места в течение некоторого времени), при расширении массива расширяйте его на 50%, если у вас нет внутренней информации, которая говорит вам разные. realloc() делает все тяжелым грузом для вас тоже (объяснено далее.) Из Интернета: -> Функция realloc() изменяет размер блока памяти, на который указывает ptr, на размер байтов. Содержимое будет оставаться неизменным в диапазоне от начала региона до минимума старого и нового размеров. Если новый размер больше старого, добавленная память не будет инициализирована. Если ptr равно NULL, то вызов эквивалентен malloc (размер) для всех значений размера; если размер равен нулю, а ptr не равен NULL, тогда вызов эквивалентен свободному (ptr). Если ptr не равен NULL, он должен быть возвращен более ранним вызовом malloc(), calloc() или realloc(). Если перемещенная область была перемещена, выполняется свободное (ptr).

Смежные вопросы