Was macht dieser Trick?

8

Es ist eine Weile her, seit ich C-Code angeschaut habe, aber ich versuche sicherzustellen, dass ich verstehe, was hier vor sich geht. Jemand hat dies deklariert (hat mehr Mitglieder in seinem Code):

%Vor%

Später benutzen sie das dann als Teil einer for-Schleife:

%Vor%

Ich denke, der erste Teil ist die Anzahl der Bytes im Array und der zweite Teil muss die Größe jedes Array-Mitglieds sein, was uns die Anzahl der Elemente im Array gibt. Ist dies eine Standardmethode zur Berechnung der Array-Länge und was ist die zweite Größe, die es tatsächlich macht?

    
Ben Flynn 27.07.2012, 21:20
quelle

3 Antworten

15

Ja, nachdem die verwirrende Syntax korrigiert wurde, wird dies

%Vor%

oder noch besser

%Vor%

Dies ist der bevorzugte Weg, um die Anzahl der Elemente eines Arrays zu berechnen. Der zweite sizeof berechnet tatsächlich die Größe des Elements 0 des Arrays.

Beachten Sie, dass dies nur funktioniert, wenn trysizes tatsächlich ein Array ist, kein Zeiger auf eins.

    
Fred Foo 27.07.2012, 21:21
quelle
1

Sie haben es verstanden. Der zweite sizeof im Nenner dekrementiert das erste Element des Arrays und ergibt die Größe des Elements 0 . sizeof kennt die gesamte Puffergröße einer Array-Variablen - den Zähler - und daher liefert dieses Idiom die Anzahl der Elemente im Array.

Nach meiner Erfahrung ist dies ein ungewöhnlicher Ausdruck dieses speziellen Idioms, das ich normalerweise gesehen habe, und ich benutze :

%Vor%

Dies identifiziert die Variable deutlicher als Array und nicht als Zeiger.

Dies ist ein ziemlich üblicher Trick, aber beachte, dass es nur funktioniert, wenn die Variable als ein Array deklariert wird, z. Dies funktioniert nicht bei einem Array, das als Funktionsparameter in einen Zeiger umgewandelt wurde.

    
pb2q 27.07.2012 21:21
quelle
1

Der Schlüssel dazu ist, dass wir bei Verwendung von sizeof, obwohl wir meistens int a; sizeof(a); verwenden, auch die Klammern weglassen können: int a; sizeof a;
Also in diesem Fall sizeof*(trysizes) == sizeof *trysizes == sizeof(*trysizes)

    
duleshi 28.07.2012 03:05
quelle

Tags und Links