Nou Generator de prompt AI — scrie prompturi mai bune pentru ChatGPT, Claude și Gemini →

calloc în C

Alocă memorie pentru un tablou de count elemente a câte size octeți și pune zero în toți octeții.

Sintaxă
#include <stdlib.h>
void *calloc(size_t count, size_t size);

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: calloc primește două valori (număr, dimensiune), malloc una singură (totalul).
  • Folosești calloc pentru 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 calloc trebuie eliberată cu free.

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.
Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: calloc

Ai o nelămurire despre utilizarea comenzii calloc sau 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.

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.