sizeof în C

Operatorul care spune câți octeți ocupă un tip sau o variabilă; calculat de compilator, rezultatul are tipul size_t.

Sintaxă
sizeof(tip)
sizeof expresie
sizeof tablou / sizeof tablou[0]   // numărul de elemente

Ce face sizeof

sizeof nu este o funcție, ci un operator: compilatorul îl înlocuiește cu numărul de octeți al tipului sau al expresiei. Rezultatul are tipul size_t (întreg fără semn), care se afișează cu %zu.

Pentru un tablou declarat local, sizeof tablou dă dimensiunea întregului tablou, iar sizeof tablou / sizeof tablou[0] dă numărul de elemente. Atenție: când trimiți tabloul unei funcții, acolo ajunge doar un pointer, iar sizeof dă dimensiunea pointerului.

Expresia de după sizeof nu este evaluată (cu excepția tablourilor de lungime variabilă): sizeof(x++) nu crește x.

Ce returnează

Numărul de octeți, de tip size_t. sizeof(char) este întotdeauna 1.

Exemple

Exemplul 1: Dimensiunea tipurilor pe acest calculator

Valorile sunt de pe un Mac cu procesor ARM (64 de biți). Pe alt sistem pot diferi, de exemplu long are 4 octeți pe Windows, iar long double are 16 octeți pe Linux x86-64.

#include <stdio.h>

int main(void) {
    printf("char:        %zu\n", sizeof(char));
    printf("short:       %zu\n", sizeof(short));
    printf("int:         %zu\n", sizeof(int));
    printf("long:        %zu\n", sizeof(long));
    printf("long long:   %zu\n", sizeof(long long));
    printf("float:       %zu\n", sizeof(float));
    printf("double:      %zu\n", sizeof(double));
    printf("long double: %zu\n", sizeof(long double));
    printf("int *:       %zu\n", sizeof(int *));
    return 0;
}

Rezultat

char:        1
short:       2
int:         4
long:        8
long long:   8
float:       4
double:      8
long double: 8
int *:       8

Exemplul 2: Numărul de elemente dintr-un tablou

Împărțind dimensiunea tabloului la dimensiunea unui element obții numărul de elemente. Așa bucla nu trebuie modificată când adaugi o notă.

#include <stdio.h>

int main(void) {
    int note[] = {9, 7, 10, 8, 6};
    size_t n = sizeof note / sizeof note[0];
    printf("Tabloul ocupă %zu octeți și are %zu note\n", sizeof note, n);
    for (size_t i = 0; i < n; i++) {
        printf("%d ", note[i]);
    }
    printf("\n");
    return 0;
}

Rezultat

Tabloul ocupă 20 octeți și are 5 note
9 7 10 8 6

Exemplul 3: Într-o funcție, tabloul devine pointer

Parametrul int note[] este de fapt int *, deci în funcție sizeof dă 8 (dimensiunea pointerului), nu 20. De aceea numărul de elemente se trimite separat.

#include <stdio.h>

void afiseaza(const int *note, size_t n) {
    printf("În funcție: sizeof note = %zu (pointer)\n", sizeof note);
    for (size_t i = 0; i < n; i++) {
        printf("%d ", note[i]);
    }
    printf("\n");
}

int main(void) {
    int note[] = {9, 7, 10, 8, 6};
    printf("În main: sizeof note = %zu\n", sizeof note);
    afiseaza(note, sizeof note / sizeof note[0]);
    return 0;
}

Rezultat

În main: sizeof note = 20
În funcție: sizeof note = 8 (pointer)
9 7 10 8 6

Greșeli frecvente

  • Afișezi rezultatul cu %d. sizeof dă size_t; specificatorul corect este %zu (cu -Wall, compilatorul avertizează).
  • Folosești sizeof pe un parametru-tablou sau pe un pointer primit de la malloc ca să afli câte elemente are. Dă dimensiunea pointerului; ține numărul de elemente într-o variabilă.
  • Scrii malloc(n * sizeof(int *)) când voiai sizeof(int). Forma sigură: malloc(n * sizeof *p), care ia tipul direct din pointer.

Comenzi înrudite

  • Tipuri de date (int, char, double): Tipurile de bază din C: întregi (char, short, int, long, long long), cu sau fără semn, și numere reale (float, double).
  • Tablouri (array): Un șir de elemente de același tip, așezate unul după altul în memorie și accesate prin index, de la 0.
  • 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.
  • stdint.h și limits.h: Tipuri întregi cu dimensiune exactă (int32_t, uint8_t) și constantele cu valorile minime și maxime ale tipurilor (INT_MAX).
Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: sizeof

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