Warum sollte sizeof (element) der sizeof (TYPE) vorgezogen werden, um die Anzahl der Elemente in einem Array zu berechnen?

15

Ich lese "King KNs C-Programmierung" und habe die folgende Aussage gefunden:

Wir haben die Verwendung des Ausdrucks sizeof(a)/sizeof(a[0])zur Berechnung der Anzahl der Elemente in einem Array erörtert . Der Ausdruck sizeof(a)/sizeof(t), bei dem t der Typ der Elemente eines Elements ist, würde ebenfalls funktionieren, wird jedoch als minderwertige Technik angesehen.

Warum wird es als minderwertige Technik angesehen?

Higgs
quelle
8
Haben Sie darüber nachgedacht, was passieren würde, wenn der Programmierer die Art der Elemente in a ändert? zu einem Typ mit einer anderen Größe als t. Erster Ausdruck wird noch in Ordnung, während der zweite brechen
gnat
1
@gnat: Du solltest das als Antwort geben.
Martin York

Antworten:

26

sizeof(a)/sizeof(t)Codiert den Typ explizit in den Ausdruck. Sie haben jetzt den Typ an mehreren Stellen angegeben, ohne dass der Compiler unterstützt wird, um sicherzustellen, dass Sie denselben Typ verwenden. Wenn Sie also den Basistyp des Arrays ändern, aber nicht im (vollständig getrennten) Zählausdruck Bingo: Ihr Code wird einwandfrei kompiliert, aber Ihre Elementanzahl ist falsch. Wenn Sie Glück haben, stürzt Ihr Programm ab, aber wenn nicht, funktioniert es fast vollständig korrekt, aber hin und wieder verhält es sich völlig seltsam.

sizeof(a)/sizeof(a[0])ist garantiert korrekt und erfordert nur den Namen des Arrays. Ändern Sie den Typ und es geht Ihnen gut; Ändern Sie den Array-Namen und der Compiler wird sich beschweren. Kein Denken erforderlich: Wir mögen diese Art der Programmierung.

Daniel Griscom
quelle
Nun, ich bevorzuge sizeof a/sizeof*aes wirklich , obwohl es nicht wirklich ein wesentlicher Unterschied ist.
Deduplizierer