C Програмиране

КАК ДА ИЗПОЛЗВАМЕ ФУНКЦИЯТА MALLOC В C

КАК ДА ИЗПОЛЗВАМЕ ФУНКЦИЯТА MALLOC В C
Malloc е вградена функция, декларирана в заглавния файл . Malloc е краткото име за „разпределение на паметта“ и се използва за динамично разпределение на един голям блок непрекъсната памет според посочения размер. Има два типа разпределение на паметта статично и динамично. Разпределението на статична памет се извършва по време на компилация и не се променя по време на изпълнение. Динамичното разпределение на паметта е разпределяне на памет по време на изпълнение за това; използваме malloc. Сега въпросът е откъде идва тази памет, така че всички динамични изисквания в C са изпълнени от купчината памет. По принцип нашето приложение / програма ще има 3 вида памет

  • Паметта на стека е локална за всеки метод и когато методът се върне, стекът автоматично го изчиства.
  • Областта на глобалната памет разпределя паметта за всички глобални променливи. Тази област на паметта се създава в началото на програмата и в крайна сметка тя автоматично изчиства областта на паметта.
  • Куп паметта винаги е враг, отговарящ на всички динамични изисквания на програма / приложение. Всеки път, когато ще използваме функцията malloc, тя ще заеме малко памет от купчината и ще ни даде указателя към нея.

Синтаксис:

Синтаксисът на malloc е (void *) malloc (size_t size). Така че синтаксисът казва, че malloc изисква размер, той ще върне показалеца основно празен указател и размер t е дефиниран в като неподписано цяло число. Функцията Malloc просто разпределя блок памет според размера, посочен в купчината, както можете да видите в синтаксиса, че размерът трябва да бъде посочен и при успех връща указател, сочещ към първия байт на разпределената памет, иначе връща NULL. И така, работата на malloc е да разпределя паметта по време на изпълнение.

Защо празен указател:

Malloc няма представа към какво сочи; това просто означава, че не знае какви данни ще се съхраняват в това място в паметта. Той просто разпределя памет, поискана от потребителя, без да знае вида на данните, които трябва да се съхраняват в паметта. Ето защо той връща празен указател.

Malloc просто разпределя паметта след това е отговорност на потребителя да typecast към подходящ тип, така че да може да се използва правилно в програмата. Poid указател е указател, който може да насочва всеки тип данни malloc връща void указател, защото не знае кой тип данни ще се съхраняват в тази памет.

Тук ние искаме malloc да разпредели 6 байта памет сега, ако успехът malloc ще върне празен указател. В този случай трябва да го въведем в указател на цял тип, защото искаме да съхраним цяло число в тази памет. Тук malloc разпределя 6 байта памет в купчина, а адресът на първия байт се съхранява в указателя ptr.

Примерна програма:

Ето една проста примерна програма, за да разберем правилно понятието malloc.

Тук можете да видите с функцията printf, моля потребителя да въведе броя на целите числа. Декларирахме две променливи над i и n. Променливата n е мястото, където ще съхраним въведеното от потребителя число. След това имаме функция malloc; искаме malloc да разпредели размера, еквивалентен на размера на n цели числа. Умножаваме размера, ако int с n; това ще ни даде размера на n цели числа. След това malloc ще върне празен указател и ние го въвеждаме в цял указател и съхраняваме адреса в указателя ptr. Типирането е важно, тъй като е добра практика.

Сега, ако указателят съдържа NULL, това означава, че паметта не е налична. Така че ние просто ще излезем от програмата със статус на неуспешен изход. Ако случаят не е такъв, можем лесно да стартираме цикъла for.

Цикълът ще се изпълнява от 0 до n-1 и ние ще помолим потребителя да въвежда цяло число едно по едно всеки път. Във функцията scanf има едно нещо, написано ptr + i, тъй като знаем, че ptr съдържа адреса на първия байт памет. Да кажем, че адресът е 1000 тук i, първоначално е равен на нула, така че 1000 + 0 е 1000, така че в рамките на този адрес ще се съхранява първото ни цяло число, след това, когато i стане 1, така 1000 + 1, което вътрешно се интерпретира като (1000) +1 * 4, ако приемам, че размерът на цялото число е 4 байта и би бил равен на 1004, така че следващото цяло число ще се съхранява в рамките на 1004 местоположение. И това ще продължи по този начин адресите са като 1000, 1004, 1008 и т.н. Не използваме амперсанд преди ptr + i, защото ptr вече ни дава адреса, когато пишем ptr, който е просто указател и съдържа адреса, а не стойността, така че няма изискване да се поставя амперсанд пред него и тази концепция трябва да е ясна.

Тук в този цикъл просто правим едно нещо, като отпечатваме всички цели числа на екрана; очевидно, ние използваме ptr + i, но тук, в този случай, ние го деререферентираме, защото ptr + i представлява адрес, така че трябва да го деререферираме. Ако аз съм равен на 0, това ще бъде 1000, тъй като приемаме, че първият адрес ще бъде 1000, така че го преориентираме; ще получим първото цяло число, тогава i е равно на 1, и то ще стане 1001, но се интерпретира като 1004, ако размерът на цялото число е 4. Отново. Преориентираме го, така че ще ни даде 2nd цяло число. По този начин всичко работи.

Така че, това е по същество проста програма, която иска от потребителите да въведат n цяло число и след това ние просто показваме тези цели числа на екрана. След изпълнението на програмата това ще се покаже.

Първо, ние искаме от потребителя да въведе броя на целите числа, а след това потребителят въвежда целите числа и ние просто ги показваме на екрана.

Заключение:

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

Честито динамично разпределение на паметта!

OpenTTD срещу Simutrans
Създаването на собствена транспортна симулация може да бъде забавно, релаксиращо и изключително примамливо. Ето защо трябва да сте сигурни, че изпробв...
Урок за OpenTTD
OpenTTD е една от най-популярните бизнес симулационни игри там. В тази игра трябва да създадете прекрасен транспортен бизнес. Въпреки това, ще започне...
SuperTuxKart за Linux
SuperTuxKart е страхотно заглавие, създадено да ви предостави безплатно изживяването на Mario Kart във вашата Linux система. Играта е доста предизвика...