C Academy · Oppitunti

calloc ja realloc

Nollattu ja uudelleenmitoitettu muisti.

Oppitunti 2/413 vaihetta

calloc ja realloc on ilmainen C Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu C Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C Academy-kurssilla on yhteensä 4 oppituntia.

mallocin jälkeen

malloc-funktion lisäksi standardikirjasto tarjoaa calloc-funktion nollattua muistia varten ja realloc-funktion olemassa olevan lohkon koon muuttamista varten.

Molemmat ovat osa <stdlib.h>-kirjastoa.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *p = calloc(3, sizeof(int));
    printf("%d %d %d\n", p[0], p[1], p[2]);
    free(p);
    return 0;
}

calloc nollaa muistin

calloc(count, size) varaa tilaa count:lle size tavun kokoiselle alkiolle ja asettaa jokaisen tavun arvoksi nollan.

Tämä on kätevää, kun tarvitsette puhtaan lähtötilanteen.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *a = calloc(5, sizeof(int));
    int sum = 0;
    for (int i = 0; i < 5; i++) sum += a[i];
    printf("sum of zeroed array = %d\n", sum);
    free(a);
    return 0;
}

calloc-funktiolla on kaksi argumenttia

Toisin kuin malloc, calloc saa alkioiden lukumäärän ja koon erillisinä argumentteina.

Se myös estää ylivuodon, joka voisi syntyä lukumäärää ja kokoa kerrottaessa.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    double *d = calloc(4, sizeof(double));
    d[2] = 1.5;
    printf("%f %f\n", d[0], d[2]);
    free(d);
    return 0;
}

malloc vai calloc

Käyttäkää malloc-funktiota, kun korvaatte joka tapauksessa jokaisen tavun, ja calloc-funktiota, kun tarvitsette muistin olevan aluksi nollattu.

calloc kuluttaa hieman enemmän resursseja nollaamisen vuoksi.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *m = malloc(2 * sizeof(int));
    int *c = calloc(2, sizeof(int));
    m[0] = 5; m[1] = 6;
    printf("malloc: %d %d\n", m[0], m[1]);
    printf("calloc: %d %d\n", c[0], c[1]);
    free(m); free(c);
    return 0;
}

Kasvattaminen reallocilla

realloc(ptr, newsize) muuttaa lohkon kokoa ja säilyttää sen olemassa olevan sisällön vanhan ja uuden koon pienempään arvoon asti.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *a = malloc(2 * sizeof(int));
    a[0] = 1; a[1] = 2;
    a = realloc(a, 4 * sizeof(int));
    a[2] = 3; a[3] = 4;
    for (int i = 0; i < 4; i++) printf("%d ", a[i]);
    printf("\n");
    free(a);
    return 0;
}

realloc saattaa siirtää lohkon

realloc saattaa palauttaa eri osoitteen, jos se siirtää lohkon löytääkseen sille tilaa.

Sijoittakaa tulos aina takaisin osoittimeen älkääkä enää käyttäkö vanhaa osoitinta.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *a = malloc(sizeof(int));
    a[0] = 42;
    int *bigger = realloc(a, 100 * sizeof(int));
    printf("first element still %d\n", bigger[0]);
    free(bigger);
    return 0;
}

Turvallinen realloc-malli

Jos realloc epäonnistuu, se palauttaa arvon NULL mutta säilyttää alkuperäisen lohkon muuttumattomana.

Sijoittakaa tulos ensin väliaikaiseen muuttujaan, jotta ette menetä vanhaa osoitinta epäonnistumisen yhteydessä.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *a = malloc(2 * sizeof(int));
    int *tmp = realloc(a, 8 * sizeof(int));
    if (tmp == NULL) {
        free(a);
        return 1;
    }
    a = tmp;
    a[7] = 99;
    printf("%d\n", a[7]);
    free(a);
    return 0;
}

Lohkon pienentäminen

realloc voi myös pienentää lohkoa. Alussa olevat alkiot säilytetään ja loppuosa vapautetaan.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *a = malloc(6 * sizeof(int));
    for (int i = 0; i < 6; i++) a[i] = i;
    a = realloc(a, 3 * sizeof(int));
    printf("%d %d %d\n", a[0], a[1], a[2]);
    free(a);
    return 0;
}

Kasvava puskuri

Yleinen toimintamalli kaksinkertaistaa kapasiteetin, kun taulukko täyttyy, mikä jaksottaa kasvun kustannuksen.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int cap = 2, len = 0;
    int *a = malloc(cap * sizeof(int));
    for (int v = 0; v < 5; v++) {
        if (len == cap) {
            cap *= 2;
            a = realloc(a, cap * sizeof(int));
        }
        a[len++] = v;
    }
    printf("len=%d cap=%d last=%d\n", len, cap, a[len-1]);
    free(a);
    return 0;
}

realloc arvolla NULL

realloc(NULL, size) toimii täsmälleen kuten malloc(size).

Näin kasvatusfunktio voi käsitellä myös ensimmäisen varauksen samalla tavalla.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *a = realloc(NULL, 3 * sizeof(int));
    a[0] = 7;
    printf("%d\n", a[0]);
    free(a);
    return 0;
}

Niiden yhdistäminen

Voitte aloittaa calloc-funktiolla saadaksenne nollatun puskurin ja kasvattaa sitä myöhemmin realloc-funktiolla. Kasvun myötä lisätyt tavut eivät ole nollattuja.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *a = calloc(2, sizeof(int));
    a = realloc(a, 4 * sizeof(int));
    a[2] = 0; a[3] = 0;
    printf("%d %d %d %d\n", a[0], a[1], a[2], a[3]);
    free(a);
    return 0;
}

Pikatarkistus

Testatkaa calloc- ja realloc-funktioita koskevat tietonne.

Kertaus

Opitte tuntemaan kaksi muuta muistinvaraustyökalua:

  • calloc(count, size) varaa nollattua muistia ja estää kertolaskun ylivuodon.
  • realloc(ptr, newsize) muuttaa lohkon kokoa ja saattaa siirtää sen.
  • Sijoittakaa realloc-funktion tulos aina väliaikaiseen muuttujaan, jotta vältätte muistivuodot epäonnistumisen yhteydessä.
  • realloc(NULL, size) toimii kuten malloc.
Aloita maksutta

Opi C tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
39
Oppitunnit
144

Usein kysytyt kysymykset

Onko oppitunti ”calloc ja realloc” ilmainen?

Kyllä – oppitunnin ”calloc ja realloc” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko C Academy-kurssin, päivitä CoddyKit PROhon. C Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”calloc ja realloc”?

Nollattu ja uudelleenmitoitettu muisti. Harjoittelet C Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni C Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin C Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”calloc ja realloc”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä C Academy-oppitunnilla?

Kyllä. Jokainen C Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. malloc ja free
  2. calloc ja realloc
  3. Muistivuodot
  4. Riippuvat osoittimet
← Takaisin: C Academy