Dlaczego wolisz sizeof (element) od sizeof (TYPE) do obliczania liczby elementów w tablicy?

15

Czytam „Programowanie C króla KN” i znalazłem następującą wypowiedź:

Omówiliśmy użycie wyrażenia sizeof(a)/sizeof(a[0])do obliczenia liczby elementów w tablicy. Wyrażenie sizeof(a)/sizeof(t), w którym t jest rodzajem elementów a, również by działało, ale jest uważane za gorszą technikę.

Dlaczego jest uważany za gorszą technikę?

Higgs
źródło
8
czy zastanawiałeś się, co by się stało, gdyby programista zmienił typ elementów w? do typu o innym rozmiarze niż t. Pierwsze wyrażenie nadal będzie w porządku, a drugie złamie
komnata
1
@gnat: Powinieneś udzielić odpowiedzi.
Martin York,

Odpowiedzi:

26

sizeof(a)/sizeof(t)jawnie koduje typ w wyrażeniu. Teraz masz typ określony w wielu lokalizacjach, bez obsługi kompilatora dla zapewnienia, że ​​używasz tego samego typu. Tak więc, jeśli zmienisz podstawowy typ tablicy, ale nie w (całkowicie oddzielnym) wyrażeniu liczącym, bingo: kod będzie dobrze się kompilował, ale liczba elementów będzie niepoprawna. Jeśli masz szczęście, twój program się zawiesi, ale jeśli nie, będzie działał prawie całkowicie poprawnie, ale co jakiś czas będzie zachowywał się całkowicie dziwnie.

sizeof(a)/sizeof(a[0])gwarantuje poprawność, wymagając jedynie nazwy tablicy. Zmień typ i wszystko w porządku; zmień nazwę tablicy, a kompilator będzie narzekał. Nie wymaga myślenia: lubimy tego rodzaju programowanie.

Daniel Griscom
źródło
Naprawdę wolę sizeof a/sizeof*a, chociaż nie jest to tak naprawdę istotna różnica.
Deduplicator