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

Масивите от произволна дължина и динамично разпределение на паметта на стека

Най-C90 не е възможно да се създаде набор от произволна дължина. размер на масива трябва да се знае по време на компилация

Стандартът C99, възможността да се създаде масив, размерът на които не е известно по време на компилация. Например, възможно е да се прехвърли функциите на масива и да се създаде временна масив

Масивите от произволна дължина не може да се инициализират при сътворението. Например, следния код няма да се компилира

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

Независимо от това, VSE не поддържа тази иновация и не се случва в бъдеще.

Как мога да създавате динамично масив от произволен размер на стека? Очевидно е, че ние се нуждаем от функция, която ще позволи да се разпределят памет в стека. Тази функция се нарича alloca или _alloca и се определя в библиотека malloc.h

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

Но тук възниква същия проблем като с масиви от произволна дължина - ако се разпределят твърде много памет, ще настъпи препълване на стека. _alloca функция, за разлика от изчистване, връща NULL, ако не могат да се разпределят на паметта и създава структурирана стека преливане изключение. Така например, се обадете

Затова предлагаме метод за изолиране

Това не е много хубаво. Освобождаване само след излизане от функцията, а не след надхвърляне изяви. _alloca функция впоследствие беше забранен и заменен с функция _malloca. Той се различава с това, че за пръв път се опитва да разпредели пространството в стека, а ако не може да го направи, той разпределя пространство на куп, това е, работи като изчистване. Въпреки това, ако паметта могат да бъдат разпределени на куп, а след това, че е необходимо да се освободи след себе си. За тази цел _freea функция. Когато паметта се разпределя в стека, функцията не прави нищо. Когато паметта се разпределя на куп, а след това _freea го пуска като стандартна безплатно. Тази цена е за по-безопасно използване.

malloca при разпределяне на паметта на куп държи като изчистване. Това е, ако паметта не може да се алокира, те ще бъдат върнати NULL.

ЗАБЕЛЕЖКА: _malloca ще разпредели памет в стека само освобождаване. В отстраняване на грешки версия на паметта на проекта винаги се дава на куп.

RU-Cyrl 18- Упътване Sypachev S.S. 1989-04-14 [email protected] Степан Sypachev студенти

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

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