calloc() függvény a C Library-ben a PÉLDA programmal

⚡ Okos összefoglaló

A C nyelvben a calloc() függvény több összefüggő memóriablokkot foglal le a heap-en, és minden bájtot nullára inicializál, egy void pointert adva vissza, amely lehetővé teszi a programok számára, hogy futásidőben tiszta, használatra kész tömböket és adatszerkezeteket hozzanak létre.

  • 🧠 Nulla inicializált memória: A calloc() minden lefoglalt bájtot nullára állít, ellentétben a malloc()-tal, amely kiszámíthatatlan szemétértékeket hagy maga után.
  • 📦 Két érv: A calloc(n, size) n darab, adott méretű blokkot foglal le egy összefüggő régióban.
  • ⚠️ NULL ellenőrzés: Egy sikertelen lefoglalás NULL mutatót ad vissza, ezért használat előtt ellenőrizni kell az eredményt.
  • 🆚 kalloc vs. malloc: Tiszta, nullázott tömbökhöz válaszd a calloc()-ot, és ha a sebesség fontosabb, mint az inicializálás, akkor a malloc()-ot.
  • 🧹 Szabadítsd fel a memóriát: Engedj el minden calloc() blokkot a free() függvénnyel a memóriavesztés elkerülése érdekében.
  • 🤖 AI segítség: A mesterséges intelligencia asszisztensei és a GitHub Copilot calloc() hívásokat terveznek, és hiányzó free() utasításokat jeleznek.

calloc() függvény C-ben

Mi a calloc C-ben?

A C nyelvben használt calloc() függvény több, azonos méretű memóriablokk lefoglalására szolgál. Ez egy dinamikus memóriaelosztási függvény, amely a memóriaterületet összetett adatstruktúrákhoz, például tömbökhöz és struktúrákhoz osztja ki, és egy void pointert ad vissza a memóriára. A Calloc a contiguous allocation (folytonos allocation) rövidítése.

Malloc függvény Egyetlen memóriablokk lefoglalására szolgál, míg a C-ban a calloc függvény több memóriablokk lefoglalására szolgál. A C programozásban a calloc által lefoglalt minden blokk azonos méretű.

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

A közönséges változók és a fix méretű tömbök a program fordítása során rögzítik a dimenzióikat, ami helyet pazarol, ha kevesebb elemre van szükség, és teljesen meghibásodik, ha több elemre van szükség. A calloc() ezt a korlátot úgy oldja fel, hogy futásidőben memóriát foglal le, és a malloc()-tal ellentétben minden bájtot nullára ürít, mielőtt visszaadja a blokkot. Ez teszi a calloc()-ot természetes választássá, amikor egy programnak tiszta, kiszámítható memóriaterületre van szüksége egy tömb vagy struktúra számára, amelynek mérete csak a kód futása közben ismert.

A calloc() függvény segítségével történő dinamikus allokáció számos gyakori helyzethez illeszkedik:

  • Numerikus tömbök, amelyeknek nullával kell kezdődniük, például számlálók, hisztogramok vagy futó akkumulátorok.
  • Az olyan adatszerkezetek, ahol a visszamaradt szemétértékek finom, nehezen kezelhető problémákat okoznának.tracés bogarak.
  • Buffers, amelyek hossza a felhasználói beviteltől vagy a program futása közben beolvasott fájltól függ.
  • A blokkok túl nagyok a korlátozott veremhez, mivel a calloc() a sokkal nagyobb halomból merít.

Mivel a lefoglalt blokk összefüggő és már nullázott, azonnal kezelhető használatra kész tömbként, külön inicializálási ciklus nélkül.

calloc() szintaxis:

ptr = (cast_type *) calloc (n, size);
  • A calloc fenti utasítás példája C-ben n azonos méretű memóriablokk lefoglalására szolgál.
  • A memóriaterület lefoglalása után az összes bájt nullára inicializálódik.
  • Az mutató amely jelenleg a lefoglalt memóriaterület első bájtjánál van, visszaküldésre kerül.

Ha hiba történik a memóriaterület lefoglalásakor, például memóriahiány, akkor nulla mutatót ad vissza, amint az az alábbi calloc példában látható.

Hogyan kell használni a calloc-ot

Az alábbi calloc program C-ben kiszámítja egy számtani sorozat összegét.

#include <stdio.h>
    int main() {
        int i, * ptr, sum = 0;
        ptr = calloc(10, sizeof(int));
        if (ptr == NULL) {
            printf("Error! memory not allocated.");
            exit(0);
        }
        printf("Building and calculating the sequence sum of the first 10 terms \ n ");
        for (i = 0; i < 10; ++i) { * (ptr + i) = i;
            sum += * (ptr + i);
        }
        printf("Sum = %d", sum);
        free(ptr);
        return 0;
    }

A calloc eredménye a C példában:

 
Building and calculating the sequence sum of the first 10 terms
Sum = 45

Különbség a calloc() és a malloc() között

A calloc() és a malloc() egyaránt memóriát foglal le a heap-en, és mindkettő void pointert, vagyis hiba esetén NULL-t ad vissza, mégis három gyakorlati szempontból különböznek, amelyek eldöntik, melyiket használják.

  • Inicializálás: a calloc() függvény minden bájtot nullára állít az új blokkban, míg a malloc() függvény a tartalmat inicializálatlanul hagyja, így a malloc() blokk kiszámíthatatlan szemetet tárol, amíg a program nem ír bele.
  • Argumentumok: a calloc() két argumentumot fogad el, az elemek számát és mindegyik méretét, írva: calloc(n, size); a malloc() egyetlen argumentumot fogad el, a bájtok teljes számát, írva: malloc(n * size).
  • Sebesség: a malloc() valamivel gyorsabb, mivel kihagyja a nullázási lépést, ezért a memóriát azonnal felülíró kód gyakran ezt a függvényt részesíti előnyben.

Mindkét függvény az stdlib.h fájlban van deklarálva, és mindkettő ugyanazzal a free() függvénnyel szabadítja fel a memóriáját. A calloc() függvényt akkor válaszd, ha a tiszta, nullázott blokk fontos, a malloc() függvényt pedig akkor, ha a nyers sebesség a célszerűbb, és a program maga kezeli az inicializálást.

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

A calloc() által lefoglalt memória a heap-en található, és soha nem szabadul fel automatikusan. Amikor egy program folyamatosan foglal le anélkül, hogy felszabadítana, 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 későbbi lefoglalásokhoz újra felhasználható.

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

int *ptr;
ptr = calloc(10, sizeof(int));
if (ptr != NULL) {
    /* use the allocated memory here */
    free(ptr);   /* release the block */
    ptr = NULL;  /* avoid a dangling pointer */
}

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

  • A free() függvényt minden sikeres calloc() 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ényt alkalmazzon olyan mutatóra, amelyet a calloc() nem adott vissza, beleértve a mutatóaritmetika által eltolt mutatót is.
  • Minden allokációhoz párosítson egy felszabadulást, mielőtt a mutató kilépne a hatóköréből.

Mivel a calloc() és a malloc() is ugyanabból a heapből merít adatokat, a felszabadítási eljárás mindkét függvény esetében azonos: minden sikeres lefoglalásért egy free() függvény indul el, és utána nincs hozzáférés a blokkhoz. Keepping A C nyelven a manuális memóriakezelés alapvető szokása az egyensúlyban lévő lefoglalás és felszabadítás, és ez megakadályozza mind a szivárgásokat, mind a már visszaadott memória újrafelhasználásából eredő összeomlásokat.

GYIK

A calloc() függvény deklarálva van a standard stdlib.h könyvtár fejlécében, ezért adjuk hozzá a #include kapcsolót. a forrásfájl tetején. Enélkül a fordító figyelmeztethet egy implicit deklarációra, és félreolvashatja a visszaadott mutatót.

Amikor a heap nem tudja teljesíteni a kérést, a calloc() egy NULL mutatót ad vissza érvényes cím helyett. Használat előtt mindig hasonlítsa össze az eredményt a NULL értékkel, mert a NULL értékre való hivatkozás törlése definiálatlan viselkedést okoz, és általában összeomlik a program.

Igen. A calloc() bármilyen típussal működik, beleértve a struktúrákat és a struktúrák tömbjeit is, az elemszám és a sizeof(struct) átadásával. Minden tag nullázódik, ami tiszta kezdőállapotot ad manuális inicializálási ciklus nélkül.

Igen. A realloc() elfogadja a calloc() vagy malloc() által visszaadott mutatókat, és növeli vagy zsugorítja a blokkot, megőrizve a meglévő adatokat. A realloc() által hozzáadott új bájtok nem nullázódnak, ezért szükség esetén inicializáld őket magad.

Az eredmény implementáció-definiált: a calloc() NULL értéket vagy egy egyedi mutatót adhat vissza, amelyre nem lehet dereferenciálni, de biztonságosan átadható a free()-nek. Mindkét eredményt kezeljük „nincs használható memória”-ként, és kerüljük az olvasását belőle.

A calloc() függvény egy elég nagy, összefüggő régiót tart fenn az összes kért elem számára, így azok tömbcellákhoz hasonlóan egymás mellett helyezkednek el. A név is ezt a folytonos, üres blokkot tükrözi, lehetővé téve a mutató aritmetikai műveletek megbízható végrehajtását a memóriában.

Igen. A mesterséges intelligencia által fejlesztett kódolóasszisztensek calloc() hívásokat terveznek, NULL ellenőrzéseket adnak hozzá, és jelzik a hiányzó free() hívásokat vagy szivárgásokat, valamint elmagyarázzák a mutatószámtani hibákat. A generált kódot mindig fordítsa le és tesztelje, mielőtt éles környezetben megbízna benne.

GitHub másodpilóta A calloc() é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: