malloc() Funktsioon C teegis koos EXAMPLE'iga
โก Nutikas kokkuvรตte
C-keeles reserveerib malloc() kรคitusajal heapile mรคluploki ja tagastab selle esimesele baitile tรผhise pointeri, vรตimaldades programmidel taotleda teadmata suurust salvestusruumi kuni koodi tegeliku kรคivitamiseni.

Mis on malloc C-s?
Funktsioon malloc () tรคhistab mรคlu eraldamist. See on funktsioon, mida kasutatakse mรคluploki dรผnaamiliseks eraldamiseks. See reserveerib mรครคratud suurusega mรคluruumi ja tagastab mรคlukohale osutava nullkursori. Tagastatud kursor on tavaliselt tรผhine. See tรคhendab, et saame mรครคrata mis tahes osutile malloc funktsiooni.
Sรผntaks
ptr = (cast_type *) malloc (byte_size);
Siin
- ptr on cast_type kursor.
- Funktsioon malloc tagastab kursori eraldatud mรคlule byte_size.
Example: ptr = (int *) malloc (50)
Kui see lause on edukalt tรคidetud, reserveeritakse 50 baiti suurune mรคluruum. Reserveeritud ruumi esimese baidi aadress mรครคratakse int tรผรผpi osutile ptr.
Mรตelge veel รผhele malloci rakendamise nรคitele:
#include <stdlib.h> int main(){ int *ptr; ptr = malloc(15 * sizeof(*ptr)); /* a block of 15 integers */ if (ptr != NULL) { *(ptr + 5) = 480; /* assign 480 to sixth integer */ printf("Value of the 6th integer is %d",*(ptr + 5)); } }
Vรคljund:
Value of the 6th integer is 480
Pane tรคhele, et koodi tรถรถkindlamaks muutmiseks, kui *ptr deklaratsioon hiljem teisele andmetรผรผbile tรผรผbimuundatakse, kasutati sizeof(int) asemel sizeof(*ptr).
Jaotamine vรตib ebaรตnnestuda, kui mรคlust ei piisa. Sel juhul tagastab see NULL osuti. Seega peaksite NULL-osuti kontrollimiseks lisama koodi.
Pea meeles, et eraldatud mรคlu on kรผlgnev ja seda saab kรคsitleda massiivina. Me saame kasutada pointer Massiivi elementide juurde pรครคsemiseks soovitame kasutada aritmeetikat nurksulgude [] asemel. Soovitame massiivi elementide viitamiseks kasutada +, sest inkrementeerimise ++ vรตi += kasutamine muudab pointeri salvestatud aadressi.
Funktsiooni Malloc saab kasutada ka nii mรคrgi andmetรผรผbi kui ka keerukate andmetรผรผpidega, nรคiteks struktuuridega.
Miks kasutada C-s malloc() funktsiooni?
Staatilised massiivid ja tavalised muutujad fikseerivad oma suuruse programmi kompileerimise ajal, mis raiskab ruumi, kui nรตue osutub vรคiksemaks, ja ebaรตnnestub tรคielikult, kui see osutub suuremaks. malloc() lahendab selle probleemi, taotledes mรคlu kรคitusajal, nii et programm saab puhvri suuruse mรครคrata tรคpselt vastavalt vastuvรตetud andmete hulgale. See kรคitusaegne paindlikkus on programmi tuum. dรผnaamiline mรคlu eraldamine C-s.
Dรผnaamiline eraldamine malloc() abil on รตige valik mitmes tavalises olukorras:
- Sisendi hulk on teadmata enne programmi kรคivitamist, nรคiteks faili vรตi kasutaja antud loendi lugemist.
- Vaja on suuri plokke, mis piiratud pinu รผletรคituksid, kuna malloc() ammutab andmeid palju suuremast kuhjast.
- Andmed peavad elama kauem kui funktsioon, mis need lรตi, sest heap-mรคlu pรผsib kuni see selgesรตnaliselt vabastatakse.
- Struktuurid ja massiivid peavad programmi tรคitmise ajal kasvama vรตi kahanema.
Kuna reserveeritud plokk antakse tagasi pointerina, saab seda funktsioonide vahel odavalt edastada ilma alusandmeid kopeerimata.
Kuidas vabastada malloc() abil eraldatud mรคlu
Malloc() poolt reserveeritud mรคlu asub heapis ja seda ei vabastata kunagi automaatselt. Kui programm eraldab pidevalt mรคlu ilma seda vabastamata, tarbib see aeglaselt kogu saadaolevat mรคlu, seda defekti nimetatakse mรคlulekkeks. Funktsioon free() tagastab sรผsteemile valmis ploki, et ruumi saaks uuesti kasutada.
Funktsioon free() vรตtab รผhe argumendi, malloc() tagastatud pointeri, ja vabastab kogu ploki korraga:
int *ptr; ptr = malloc(10 * sizeof(int)); if (ptr != NULL) { /* use the allocated memory here */ free(ptr); /* release the block */ ptr = NULL; /* avoid a dangling pointer */ }
Dรผnaamilise mรคlu ohutuks haldamiseks jรคrgige neid reegleid:
- Kutsu free() funktsiooni vรคlja tรคpselt รผks kord iga eduka malloc() funktsiooni korral; sama ploki kaks korda vabastamine pรตhjustab defineerimata kรคitumist.
- Pรคrast vabastamist mรครคrake pointer NULL-iks, et seda ei saaks rippuva pointerina uuesti kasutada.
- Mitte kunagi ei free() funktsiooniga teostata pointeri tagastamist, mida malloc() ei tagastanud, kaasa arvatud pointeri aritmeetika poolt nihutatud pointer.
- Enne kui kursor vรคljub ulatusest, sobita iga jaotus vastava vรคljalaskega.
Mitte รผhtegiping C-keele kรคsitsi mรคluhalduse pรตhidistsipliin on tasakaalustatud eraldamine ja vabastamine ning see hoiab รคra nii lekked kui ka krahhid, mis on pรตhjustatud vabanenud mรคlu taaskasutamisest.
malloc() vs calloc(): Peamised erinevused
malloc() ja calloc() Mรตlemad reserveerivad kuhjamรคlu, kuid erinevad oma argumentide ja uue ploki kรคsitlemise poolest. malloc() vรตtab รผhe argumendi, baitide koguarvu, ja jรคtab sisu initsialiseerimata, seega hoiab plokk ettearvamatuid prรผgivรครคrtusi, kuni programm sinna kirjutab. calloc() vรตtab kaks argumenti, elementide arvu ja iga suuruse, ning tรผhjendab iga baidi enne pointeri tagastamist nulliks.
Praktilised erinevused taanduvad kolmele punktile:
- Initsialiseerimine: calloc() nullib mรคlu, malloc() aga mitte, mis teeb malloc() veidi kiiremaks, kui vรครคrtused niikuinii รผle kirjutatakse.
- Argumendid: kirjutad malloc(n * size), aga calloc(n, size) reserveerib sama massiivi.
- Kasutusjuhtum: vali calloc(), kui oluline on puhas, nullitud plokk, ja malloc(), kui eelistatakse kiirust ja initsialiseerimine toimub kรคsitsi.
Mรตlemad funktsioonid deklareeritakse failis stdlib.h, mรตlemad tagastavad vea korral tรผhise pointeri vรตi NULL-i ning mรตlemad annavad oma mรคlu tagasi sama free() funktsiooniga.

