Ce face calloc
calloc face două lucruri față de malloc: primește separat numărul de elemente și dimensiunea unuia, și umple blocul cu octeți zero. Pentru întregi asta înseamnă valoarea 0, pentru pointeri și double înseamnă practic NULL și 0.0 pe toate platformele obișnuite.
Un alt avantaj: calloc verifică dacă înmulțirea count * size depășește SIZE_MAX și, în acest caz, returnează NULL, în loc să aloce un bloc mai mic decât ai cerut.
Memoria se eliberează tot cu free. Dacă oricum suprascrii imediat toate elementele, malloc este suficient.
Parametri
| Parametru | Descriere |
|---|---|
count |
Numărul de elemente. |
size |
Dimensiunea unui element în octeți (de obicei sizeof *p). |
Ce returnează
Un pointer spre blocul alocat și pus pe zero sau NULL dacă alocarea eșuează (inclusiv când count * size ar fi prea mare).
Exemple
Exemplul 1: Contoare pornite de la zero
Numărăm câte note de fiecare valoare (1–10) există. Tabloul de contoare trebuie să înceapă cu zero, deci calloc este alegerea potrivită.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int note[] = {9, 7, 10, 9, 8, 10, 9};
size_t n = sizeof note / sizeof note[0];
int *frecventa = calloc(11, sizeof *frecventa);
if (frecventa == NULL) return 0;
for (size_t i = 0; i < n; i++) frecventa[note[i]]++;
for (int nota = 1; nota <= 10; nota++) {
if (frecventa[nota] > 0) printf("nota %2d: %d\n", nota, frecventa[nota]);
}
free(frecventa);
return 0;
}
Rezultat
nota 7: 1
nota 8: 1
nota 9: 3
nota 10: 2
Exemplul 2: Structuri cu toate câmpurile goale
Fiecare structură începe cu numele gol (primul octet este '\0') și 0 puncte.
#include <stdio.h>
#include <stdlib.h>
typedef struct {
char nume[20];
int puncte;
} Jucator;
int main(void) {
Jucator *echipa = calloc(3, sizeof *echipa);
if (echipa == NULL) return 0;
echipa[1].puncte = 12;
for (int i = 0; i < 3; i++) {
printf("jucător %d: nume \"%s\", puncte %d\n", i, echipa[i].nume, echipa[i].puncte);
}
free(echipa);
return 0;
}
Rezultat
jucător 0: nume "", puncte 0
jucător 1: nume "", puncte 12
jucător 2: nume "", puncte 0
Exemplul 3: calloc refuză o înmulțire prea mare
SIZE_MAX / 2 elemente a câte 4 octeți depășesc orice dimensiune posibilă. calloc detectează depășirea și returnează NULL.
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
int main(void) {
int *p = calloc(SIZE_MAX / 2, sizeof(int));
printf("rezultat: %s\n", p == NULL ? "NULL (alocare refuzată)" : "alocat");
free(p); // free(NULL) nu face nimic
return 0;
}
Rezultat
rezultat: NULL (alocare refuzată)
Greșeli frecvente
- Inversezi argumentele cu
malloc:callocprimește două valori (număr, dimensiune),mallocuna singură (totalul). - Folosești
callocpentru performanță „gratuită”. Punerea pe zero costă ceva timp la blocuri mari; folosește-l când chiar ai nevoie de zerouri. - Uiți că și memoria de la
calloctrebuie eliberată cufree.
Comenzi înrudite
malloc: Cere sistemului un bloc de memorie de mărimea dată, în timpul rulării, și returnează adresa lui sau NULL dacă nu reușește.realloc: Schimbă dimensiunea unui bloc alocat dinamic, păstrând conținutul; poate muta blocul la altă adresă.free: Eliberează un bloc alocat cu malloc, calloc sau realloc, ca memoria să poată fi refolosită.memset: Umple primii n octeți ai unei zone de memorie cu aceeași valoare, de obicei 0.struct: Grupează mai multe valori de tipuri diferite într-un singur tip nou, de exemplu numele, vârsta și orașul unei persoane.
Întrebări & Exemple de Cod:
callocAi o nelămurire despre utilizarea comenzii
callocsau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!
Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.