ПредишенСледващото

Указатели се използват за динамично разпределяне на компютърна памет за съхраняване на данни. Динамичното разпределение означава, че програмата заделя памет за данни по време на неговото изпълнение. Memory разпределени на глобални променливи по време на компилация, а за не-статични локалните променливи - в стека. Докато програмата е нито глобални, нито локални променливи не могат да бъдат отпуснати допълнително памет. Но често такава необходимост възниква, както и размера на необходимата памет не е известен предварително. Това се случва, например, с помощта на динамични структури от данни, като например свързани списъци или двоични дървета. Такива структури от данни по време на изпълнение на програмата, разширени или намалени, както се изисква. За реализиране на тези структури в програмата нужда от средства, които могат, ако е необходимо да се разпределят и преразпредели памет за тях.

Споменът разпределени на данни с динамично разпределение е в така наречената динамично разпределена площ памет (куп) [1]. Динамично разпределя площ памет - това е зона, свободна памет не се използва от програмата, операционната система или други програми. Размерът на площта на куп не е известна предварително, но като правило има достатъчно памет, за да се настанят на данните от програмата. Повечето компилатори поддържат функции на библиотека, за да получите текущия размер на динамично разпределени области на паметта, но тези функции не са определени в стандарт C. Въпреки че размерът на зоната на купчина е много голям, но все пак е ограничен и може да бъде изчерпан.

В основата на динамична система за разпределение C са функции изчистване () и безплатен (). Тези функции работят заедно. изчистване () функция разпределя памет и свободно () - го освобождава. Това означава, че за всяка функция искане изчистване () заделя желаното място свободна памет, безплатна () го освобождава, че се връща на системата. В програма, която използва тези функции, трябва да се включи заглавният файл .

Прототип изчистване () функция е както следва:

Тук kolichestvo_baytov - количеството памет, необходима за данни. (Тип size_t е определено в тъй като някои цяло неподписан.), функцията за изчистване () връща указател от тип нищожен *. така че може да се причисли към показалеца на всякакъв вид. При успех, изчистване () връща указател към първия байт на непрекъсната площ заделена памет в областта на купчина. Ако на куп не е достатъчно, зона за свободна памет памет, за да удовлетвори искането, паметта не се освобождава и изчистване () връща нула.

В следващия програмен фрагмент част непрекъсната памет разпределени обема на 1000 байта:

След възлагане на р показалеца точки за първите 1000 байта на отпуснатата района памет.

В следващия пример, заделено за 50 числа. За да се подобри мобилността (преносимост от един компютър на друг), използван от sizeof на оператора.

Тъй като динамично разпределя памет не е безкрайна, то е необходимо да се провери данните за всяко разположение, независимо дали тя се е състояла. Ако изчистване () не успя поради някаква причина, изберете желаната памет, той се връща на нула. Следният пример показва как да се провери успеха на настаняването:

Разбира се, вместо да напусне изхода на програмата (), можете да сложите всеки манипулатор грешка. А трябва тук да се нарече само изискване е да не използвате показалеца стр. ако тя е равна на нула.

безплатно функция () е обратното на изчистване (функция), в смисъл, че той се връща част от системната памет, разпределени преди това с помощта на изчистване (функция). С други думи, той освобождава част памет, която може да се използва повторно функция изчистване (). безплатно функция () има следния прототип:

Тук р - указател към парче памет, предназначени за тази функция изчистване (). безплатно () функция в никакъв случай не може да се нарече с грешен аргумент, е незабавно да унищожи всички система за разпределение на паметта.

Подсистема динамично разпределение на C се използва заедно с насоки за създаване на различни софтуерни структури като свързани списъци и двоични дървета. Няколко примери за използването на такива структури са описани в част IV. Тук ние считаме, друг важен прилагане на динамично разпределение: поставяне на масиви.

Динамичното разпределение на масиви с памет

Доста често има нужда да се разпределят памет динамично с помощта на изчистване (). но да се работи с този удобен памет, както ако бяха масив, който може да се индексира. В този случай, трябва да създадете динамичен масив. Направете го лесно, защото всеки указател може да се индексира като масив. В следващия пример едномерен масив съдържа динамичен низ:

Преди първата употреба е, програмата проверява дали разпределението на паметта е била успешна. Тази проверка е необходимо да се предотврати случайно използване на нулев указател. Моля, имайте предвид, че е с помощта на показалеца, за да получава () функция. както и на изхода на екрана (но този път като обикновен масив).

Възможно е също така да се динамично разпределяне на многомерен масив. За да направите това, трябва да се декларира указател, който определя всички, но най-лявата измерение на масива. Следващият пример [2] двумерен масив съдържа динамичен маса на номера от 1 до 10 градуса на 1, 2, 3 и 4.

Програмата показва следното:

Р показалка в основната програма (основна ()) е обявена като

Както бе споменато по-рано, в C ++ трябва да конвертирате типове указатели изрично. Поради това, в програмата е подходяща и в C и в C ++, трябва изрично хвърли стойността върната от изчистване (). По тази линия, в която индексът р е назначена на тази стойност, трябва да бъде пренаписана, както следва:

Много програмисти използват изрични тип реализации указатели за съвместимост с C ++.

[1] прилага други имена: динамична област. динамично разпределя района. куп. неподреден масив (данни).

Свързани статии

Подкрепете проекта - споделете линка, благодаря!