static în C

Într-o funcție, variabila își păstrează valoarea între apeluri; la nivel de fișier, ascunde funcția sau variabila de celelalte fișiere.

Sintaxă
static int contor = 0;          // în funcție: își păstrează valoarea între apeluri
static void ajutor(void) { }     // în fișier: vizibilă doar în acest fișier
static int total_global;

Ce face static

static are două sensuri, după locul în care apare. Pe o variabilă locală, schimbă durata de viață: variabila este creată o singură dată, la pornirea programului, și își păstrează valoarea între apeluri. Inițializarea (= 0) are loc o singură dată și trebuie să fie o constantă.

La nivel de fișier (în afara funcțiilor), static schimbă vizibilitatea (legătura internă): funcția sau variabila globală se vede doar în fișierul .c curent. Alte fișiere pot avea propriile funcții cu același nume fără conflict la legare. Este bine să marchezi static tot ce nu face parte din interfața publică a fișierului.

Variabilele static și cele globale care nu sunt inițializate explicit pornesc de la 0 (sau pointerul nul), spre deosebire de variabilele locale obișnuite, care au valori nedefinite.

Exemple

Exemplul 1: Un contor care ține minte

numar este inițializat o singură dată; la fiecare apel crește valoarea rămasă de la apelul anterior. Variabila local pornește de la 0 la fiecare apel.

#include <stdio.h>

void vizita(void) {
    static int numar = 0;
    int local = 0;
    numar++;
    local++;
    printf("vizita nr. %d (local = %d)\n", numar, local);
}

int main(void) {
    vizita();
    vizita();
    vizita();
    return 0;
}

Rezultat

vizita nr. 1 (local = 1)
vizita nr. 2 (local = 1)
vizita nr. 3 (local = 1)

Exemplul 2: Generator de numere de factură

Funcția întoarce un șir dintr-un tampon static, care rămâne valabil după ieșire. Atenție: următorul apel suprascrie același tampon, de aceea rezultatul se folosește imediat.

#include <stdio.h>

const char *factura_noua(void) {
    static int urmatorul = 1;
    static char cod[20];
    snprintf(cod, sizeof cod, "IS-2026-%04d", urmatorul++);
    return cod;
}

int main(void) {
    printf("%s\n", factura_noua());
    printf("%s\n", factura_noua());
    printf("%s\n", factura_noua());
    return 0;
}

Rezultat

IS-2026-0001
IS-2026-0002
IS-2026-0003

Exemplul 3: Funcție static: vizibilă doar în fișier

valideaza_nota este un detaliu intern. Fiind static, alt fișier .c din proiect poate avea o funcție cu același nume fără eroare la legare. Variabila globală static neinițializată pornește de la 0.

#include <stdio.h>

static int note_invalide;   // implicit 0

static bool valideaza_nota(int n) {
    return n >= 1 && n <= 10;
}

int main(void) {
    int note[] = {9, 11, 7, 0};
    for (int i = 0; i < 4; i++) {
        if (!valideaza_nota(note[i])) note_invalide++;
    }
    printf("Note invalide: %d\n", note_invalide);
    return 0;
}

Rezultat

Note invalide: 2

Greșeli frecvente

  • Te aștepți ca static int x = 0; dintr-o funcție să fie resetat la fiecare apel. Inițializarea are loc o singură dată.
  • Returnezi un tampon static și păstrezi pointerul pentru mai târziu. Următorul apel suprascrie conținutul; copiază rezultatul dacă ai nevoie de el.
  • Folosești variabile locale static în funcții apelate din mai multe fire de execuție. Toate firele împart aceeași variabilă; ai nevoie de sincronizare sau de thread_local.

Comenzi înrudite

  • extern: Declară o variabilă globală definită în alt fișier (sau mai jos), ca să o poți folosi fără să creezi o copie nouă.
  • Funcții și prototipuri: Cum definești și declari funcții în C: tipul rezultatului, parametrii, prototipul și transmiterea argumentelor prin valoare.
  • Programe din mai multe fișiere (.c și .h): Cum împarți un program C în fișiere sursă (.c) și antete (.h), cum le compilezi separat și cum le legi într-un executabil.
  • snprintf și sprintf: Formatează text ca printf, dar îl scrie într-un tablou de caractere; snprintf nu depășește niciodată dimensiunea dată.
Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: static

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