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.

  • ๐Ÿง  Kรคitusaja eraldamine: malloc() reserveerib tรคitmise ajal mรคlu, kui nรตutav suurus pole kompileerimise ajal teada.
  • ๐Ÿ“ฆ sรผntaksit: cast_type pointer saab malloc(byte_size), mille suurust tavaliselt arvestatakse kaasaskantavuse huvides sizeof abil.
  • โš ๏ธ NULL-kontroll: Ebaรตnnestunud pรคring tagastab NULL-kursori, seega kontrollige tulemust enne sellele viitamise tรผhistamist.
  • โž• Kursori aritmeetika: Plokk on kรผlgnev, seega kasutage massiivi elementideni jรตudmiseks pigem + kui ++ mรคrki.
  • ๐Ÿงน Vabasta mรคlu: Mรคlulekete ja rippuvate pointerite vรคltimiseks vabasta iga plokk funktsiooniga free().
  • ๐Ÿค– AI abi: Tehisintellekti assistendid ja GitHub Copilot koostavad malloc() pรคringuid ja mรคrgistavad puuduvad free() laused.

malloc() funktsioon C-s

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.

Mis on malloc keeles C

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.

KKK

C-keeles on teisendus valikuline ja seda sageli ei soovitata, kuna void* teisendab automaatselt mis tahes objektiviideteks ja selgesรตnaline teisendus vรตib varjata puuduvat stdlib.h include'i. C++, aga nรคitlejad on vajalikud.

NULL-tagastusvรครคrtus tรคhendab, et pรคring ebaรตnnestus, tavaliselt ebapiisava mรคlu tรตttu. Enne pointeri kasutamist kontrollige alati seda, sest NULL-i viitamine pรตhjustab mรครคratlemata kรคitumist ja tavaliselt programmi krahhi.

realloc() muudab malloc() poolt eelnevalt reserveeritud ploki suurust, keeping olemasolevaid andmeid kuni vรคiksema suurusega. Ebaรตnnestumise korral tagastab see NULL-i ja jรคtab algse ploki puutumata, seega mรครคrake selle tulemus esmalt ajutisele pointerile.

Mรคluleke tekib siis, kui malloc() funktsiooni kuhjamรคlu ei vabastata free() funktsiooniga. Programm reserveerib pidevalt ruumi, mida see enam ei kasuta, mis vรตib jรคrk-jรคrgult ammendada talle saadaoleva mรคlu.

malloc() reserveerib mรคlu heapile, mitte pinule. Heapi plokid jรครคvad kehtima kuni free() funktsiooni kutsumiseni, seega vรตivad need elada kauem kui funktsioon, mis need lรตi, erinevalt automaatsetest pinumuutujatest, mis tagastamisel kaovad.

malloc() on teegifunktsioon, mis tagastab void* vรครคrtuse ja vajab baitide arvutamiseks sizeof vรครคrtust. C++ new on operaator, mis tagastab tรผpitud pointeri ja kutsub esile konstruktorid. malloc() tuleb siduda free()-ga ja new delete-ga.

Jah. Tehisintellektiga kodeerimise assistendid koostavad malloc() kรตnesid, lisavad NULL-kontrolle ja mรคrgistavad puuduvad free() kรตned vรตi lekked ning oskavad selgitada pointeri aritmeetikat. Enne genereeritud koodi usaldamist kompileerige ja testige see alati.

GitHubi koopia soovitab malloc() ja sizeof() funktsioone ning sobivaid free() ridu kommentaarist, mis kirjeldab teie kavatsust. RevEnne kompileerimist vaadake รผle kรตik soovitused puuduvate NULL-kontrollide ja lekete kohta.

Vรตta see postitus kokku jรคrgmiselt: