calloc ja realloc
Nollattu ja uudelleenmitoitettu muisti.
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.
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
- malloc ja free
- calloc ja realloc
- Muistivuodot
- Riippuvat osoittimet