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.sizeofdăsize_t; specificatorul corect este%zu(cu-Wall, compilatorul avertizează). - Folosești
sizeofpe un parametru-tablou sau pe un pointer primit de lamallocca să afli câte elemente are. Dă dimensiunea pointerului; ține numărul de elemente într-o variabilă. - Scrii
malloc(n * sizeof(int *))când voiaisizeof(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).
Întrebări & Exemple de Cod:
sizeofAi o nelămurire despre utilizarea comenzii
sizeofsau 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.