malloc() függvény a C könyvtárban az EXAMPLE-vel

⚡ Okos összefoglaló

A C-ben a malloc() függvény futásidőben lefoglal egy memóriablokkot a heap-en, és egy void pointert ad vissza az első bájtjára, lehetővé téve a programok számára, hogy olyan tárhelyet kérjenek, amelynek mérete ismeretlen, amíg a kód ténylegesen le nem fut.

  • 🧠 Futásidő-elosztás: A malloc() a végrehajtás során memóriát foglal le, ha a szükséges méret fordítási időben nem ismert.
  • 📦 Syntax: Egy cast_type mutató malloc(byte_size) értéket kap, amelyet általában sizeof mérettel méreteznek a hordozhatóság érdekében.
  • ⚠️ NULL ellenőrzés: Egy sikertelen kérés NULL mutatót ad vissza, ezért a dereferencia elvetése előtt ellenőrizni kell az eredményt.
  • Mutató aritmetika: A blokk összefüggő, ezért a tömb elemeinek eléréséhez a ++ helyett a + jelet kell használni.
  • 🧹 Szabadítsd fel a memóriát: Engedj el minden blokkot a free() függvénnyel, hogy elkerüld a memóriavesztést és a lelógó mutatókat.
  • 🤖 AI segítség: A mesterséges intelligencia asszisztensei és a GitHub Copilot malloc() hívásokat terveznek, és hiányzó free() utasításokat jeleznek.

malloc() függvény C-ben

Mi a malloc C-ben?

A malloc() függvény a memóriafoglalást jelenti. Ez egy memóriablokk dinamikus lefoglalására szolgáló funkció. Lefoglalja a megadott méretű memóriaterületet, és visszaadja a memóriahelyre mutató nullmutatót. A visszaadott mutató általában void típusú. Ez azt jelenti, hogy bármely mutatóhoz hozzárendelhetünk malloc függvényt.

Mi a malloc C-ben

Szintaxis

ptr = (cast_type *) malloc (byte_size);

Itt,

  • A ptr egy cast_type mutató.
  • A malloc függvény egy mutatót ad vissza a byte_size lefoglalt memóriájába.
Example: ptr = (int *) malloc (50)

Ha ez az utasítás sikeresen végrehajtódik, 50 bájtos memóriaterület kerül lefoglalásra. A lefoglalt terület első bájtjának címe az int típusú ptr mutatóhoz van hozzárendelve.

Vegyünk egy másik példát a malloc megvalósítására:

#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));
    }
}

output:

Value of the 6th integer is 480

Figyeljük meg, hogy a sizeof(*ptr) függvényt használtuk a sizeof(int) helyett, hogy a kód robusztusabb legyen, amikor a *ptr deklarációt később más adattípusra tipizáljuk.

A kiosztás sikertelen lehet, ha a memória nem elegendő. Ebben az esetben NULL mutatót ad vissza. Tehát a NULL mutató ellenőrzéséhez kódot kell megadnia.

Ne feledjük, hogy a lefoglalt memória összefüggő, és tömbként kezelhető. Használhatjuk mutató aritmetikai utasításokat kell használni a tömb elemeinek eléréséhez a szögletes zárójelek [] használata helyett. Javasoljuk, hogy a tömb elemeire + jelet hivatkozzunk, mert a ++ vagy += növelés megváltoztatja a mutató által tárolt címet.

A Malloc függvény karakteres adattípusokkal, valamint összetett adattípusokkal, például struktúrákkal is használható.

Miért érdemes a malloc() függvényt használni C-ben?

A statikus tömbök és a közönséges változók méretét a program fordítása során rögzítik, ami helyet pazarol, ha a követelmény kisebbnek bizonyul, és teljesen meghiúsul, ha nagyobbnak bizonyul. A malloc() ezt úgy oldja meg, hogy futásidőben kér memóriát, így a program a puffer méretét pontosan a fogadott adatmennyiséghez igazíthatja. Ez a futásidejű rugalmasság a lényege. dinamikus memóriafoglalás C-ben.

A malloc()-tal történő dinamikus allokáció számos gyakori helyzetben a helyes választás:

  • A bemenet mennyisége ismeretlen, amíg a program le nem fut, például egy fájl vagy egy felhasználó által megadott lista beolvasása közben.
  • Nagy blokkokra van szükség, amelyek túlcsordulnának a korlátozott veremből, mivel a malloc() a sokkal nagyobb halomból merít adatokat.
  • Az adatoknak túl kell élniük az azokat létrehozó függvényt, mivel a heap memória mindaddig megmarad, amíg explicit módon fel nem szabadítják őket.
  • A struktúráknak és tömböknek növekedniük vagy zsugorodniuk kell a program végrehajtása közben.

Mivel a lefoglalt blokk mutatóként kerül visszaadásra, olcsón átadható függvények között az alapul szolgáló adatok másolása nélkül.

Hogyan szabadítsunk fel memóriát a malloc() segítségével?

A malloc() által lefoglalt memória a heap-en található, és soha nem szabadul fel automatikusan. Amikor egy program folyamatosan foglal le memóriát felszabadítás nélkül, lassan felhasználja az összes elérhető memóriát, ezt a hibát memóriaszivárgásnak nevezik. A free() függvény egy kész blokkot ad vissza a rendszernek, így a szabad terület újra felhasználható.

A free() függvény egyetlen argumentumot fogad el, a malloc() által visszaadott mutatót, és egyszerre felszabadítja az egész blokkot:

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 */
}

A dinamikus memória biztonságos kezeléséhez kövesse az alábbi szabályokat:

  • A free() függvényt minden sikeres malloc() függvénynél pontosan egyszer hívjuk meg; ugyanazon blokk kétszeri felszabadítása definiálatlan viselkedést okoz.
  • Felszabadítás után állítsd a mutatót NULL-ra, hogy ne lehessen újra felhasználni lógó mutatóként.
  • Soha ne free() függvényként használja a malloc() függvényt olyan mutatóra, amelyet nem adott vissza, beleértve a mutatóaritmetika által eltolt mutatót is.
  • Minden allokációhoz párosítson egy megfelelő kiadást, mielőtt a mutató kilépne a hatóköréből.

Egyik semping A C nyelven a manuális memóriakezelés központi eleme az egyensúlyban lévő lefoglalás és felszabadítás, amely megakadályozza a felszabadult memória újrafelhasználásából eredő szivárgásokat és összeomlásokat.

malloc() vs. calloc(): Főbb különbségek

malloc() és calloc() Mindkettő halom memóriát foglal le, de argumentumaikban és az új blokk kezelésében különböznek. A malloc() egyetlen argumentumot fogad el, a bájtok teljes számát, és a tartalmat inicializálatlanul hagyja, így a blokk kiszámíthatatlan szemétértékeket tárol, amíg a program nem ír bele. A calloc() két argumentumot fogad el, az elemek számát és méretét, és minden bájtot nullára töröl, mielőtt visszaadja a mutatót.

A gyakorlati különbségek három pontra vezethetők vissza:

  • Inicializálás: a calloc() nullázza a memóriát, míg a malloc() nem, ami a malloc()-ot valamivel gyorsabbá teszi, ha az értékek egyébként is felülíródnának.
  • Argumentumok: malloc(n * size) utasítást írsz, de a calloc(n, size) utasítással ugyanazt a tömböt foglalod le.
  • Használati eset: válaszd a calloc()-ot, ha a tiszta, nullázott blokk fontos, és a malloc()-ot, ha a sebesség az előnyben részesített, és az inicializálást manuálisan kell kezelni.

Mindkét függvény az stdlib.h fájlban deklarálható, mindkettő void pointert vagy NULL értéket ad vissza hiba esetén, és mindkettő ugyanazzal a free() függvénnyel adja vissza a memóriáját.

GYIK

C-ben az átalakítás opcionális és gyakran nem javasolt, mivel a void* automatikusan bármilyen objektummutatóvá konvertálódik, és egy explicit átalakítás elfedheti a hiányzó stdlib.h include-ot. C++, azonban a szereplőgárda szükséges.

A NULL visszatérési érték azt jelenti, hogy a kérés sikertelen volt, általában a kevés memória miatt. Használat előtt mindig ellenőrizze a mutatót, mert a NULL definiálatlan viselkedéshez vezet, és jellemzően összeomlik a program.

A realloc() átméretezi a malloc() által korábban lefoglalt blokkot, keeping meglévő adatokat a kisebb méretig. Hiba esetén NULL értéket ad vissza, és az eredeti blokkot érintetlenül hagyja, ezért először rendelje hozzá az eredményt egy ideiglenes mutatóhoz.

Memóriaszivárgás akkor történik, amikor a malloc() függvényből származó heap memória soha nem szabadul fel a free() függvény segítségével. A program folyamatosan lefoglalja a már nem használt területet, ami fokozatosan kimerítheti a rendelkezésére álló memóriát.

A malloc() függvény a heapben foglal memóriát, nem a veremben. A heap blokkok a free() függvény meghívásáig érvényesek maradnak, így túlélhetik az őket létrehozó függvényt, ellentétben az automatikus veremváltozókkal, amelyek a visszatéréskor eltűnnek.

A malloc() egy void* értéket visszaadó könyvtárfüggvény, amelynek sizeof paraméterre van szüksége a bájtok kiszámításához. C++ A new egy operátor, amely egy típusos mutatót ad vissza és konstruktorokat hív meg. A malloc()-ot a free()-tal, a new-t pedig a delete-tal párosítsd.

Igen. A mesterséges intelligencia által fejlesztett kódolási asszisztensek malloc() hívásokat fogalmaznak meg, NULL ellenőrzéseket szúrnak be, és jelzik a hiányzó free() hívásokat vagy szivárgásokat, valamint el tudják magyarázni a mutatószámok aritmetikáját. Mindig fordítsd le és teszteld a generált kódot, mielőtt megbízol benne.

GitHub másodpilóta A malloc() és sizeof() függvényeket, valamint a szándékodat leíró megjegyzésből származó, egyező free() sorokat javasol. RevFordítás előtt tekintse át az összes javaslatot a hiányzó NULL ellenőrzésekre és szivárgásokra.

Foglald össze ezt a bejegyzést a következőképpen: