C ++ die Bedeutung der Größe eines Arrays zu bekommen

8

Hier ist ein Makro zum Erhalten der Array-Größe

%Vor%

Ich denke normalerweise (sizeof (array) / (sizeof (array [0])) ist gut genug, um die Größe des Arrays zu erhalten.

Ich schätze den Teil

%Vor%

ist die ganze Sache durch Null geteilt zu vermeiden, könnte jemand helfen zu erklären?

Vielen Dank im Voraus.

Prost,

    
r0ng 25.04.2013, 12:48
quelle

3 Antworten

12

Multiplikation von sizeof array[0] im Divisor mit

%Vor%

macht den Divisor null wenn

%Vor%

und

%Vor%

In diesen Fällen erhalten Sie während der Kompilierung eine Division durch Null, wodurch die Kompilierung fehlschlägt.

Diese Überprüfungen sind ein Versuch, Argumente zu erkennen, die Zeiger sind (sei es das Ergebnis einer Zeiger-zu-Zeiger-Umwandlung oder nicht), da man nicht wissen kann, wie groß ein "Feld" ein Zeiger auf diesen Quotienten zeigt .

Es schlägt fehl, wenn andere Zeigertypen andere Größen als void* haben, und es werden keine Zeiger auf Dinge erkannt, die nicht größer als void* s sind. Es tut wahrscheinlich mehr schadet als gut, den Autor in einem falschen Gefühl der Sicherheit zu beruhigen.

    
Daniel Fischer 25.04.2013, 13:07
quelle
6
  

Ich denke normalerweise (sizeof (array) / (sizeof (array [0])) ist gut genug, um die Größe des Arrays zu erhalten.

Obwohl es nicht deine primäre Frage ist, aber du hast es erwähnt. Die richtige Methode zur Bestimmung der Array-Größe in C ++ ist die Verwendung von Templates:

%Vor%     
Juraj Blaho 25.04.2013 13:38
quelle
1

Ich nehme an, dieser Teil ist klar: sizeof( array ) / sizeof( array[0] )

Dieser Teil (sizeof( array ) != sizeof(void*) || sizeof( array[0] ) <= sizeof(void*)) ist ein logischer Ausdruck, der wahr oder falsch ergibt. Wenn der gesamte Ausdruck berechnet wird, also sizeof( array[0] ) mit dem logischen Ausdruck multipliziert wird, konvertiert der Compiler den logischen Ausdruck in 0 oder 1. Sie haben also ein
sizeof( array ) / (sizeof( array[0] ) * 1) oder ein sizeof( array ) / (sizeof( array[0] ) * 0) .

Der erste Fall ist der normale und der gewünschte Fall. Der zweite Fall gibt Ihnen einen Compilerfehler wegen Division durch Null. Der Code wird also nicht kompiliert, wenn Sie beispielsweise Folgendes aufrufen:

%Vor%

Aber es wird keine Fehler finden wie:

%Vor%

Und es wird nicht für einen Fall kompilieren, für den ich kompilieren wollte:

%Vor%

Übrigens, wenn Sie diese Funktion als Makro deklarieren (und in C ++ würde ich die Template-Stil-Lösung wirklich bevorzugen), sollten Sie alle array im Makro auf (array) ändern.

    
Werner Henze 25.04.2013 13:22
quelle

Tags und Links