2009-10-13 14 views
28

Ich habe eine char* Array wie folgt:C sizeof char * array

char *tbl[] = { "1", "2", "3" }; 

Wie verwende ich die sizeof Betreiber die Anzahl der Elemente des Arrays zu erhalten, hier 3?

Die unten hat funktioniert, aber ist es richtig?

int n = sizeof(tbl)/sizeof(tbl[0]) 
+3

Nicht, wenn das Array als Parameter empfangen wurde. Überprüfen Sie [meine Antwort auf eine ähnliche Frage] (http://stackoverflow.com/a/10349610/481534). – Elideb

+0

Mögliches Duplikat von [Wie ermittle ich die Größe meines Arrays in C?] (Http://stackoverflow.com/questions/37538/how-do-i-de-termine-the-size-of-my-array-in) -c) –

+0

Dies wurde tatsächlich [hier] beantwortet (http://stackoverflow.com/questions/37538/c-how-do-i-determine-the-size-of-my-array) Und das war der richtige Weg es zu tun. – Ayman

Antwort

34

Ja,

size_t n = sizeof(tbl)/sizeof(tbl[0]) 

ist die typische Art und Weise, dies zu tun.

Bitte beachten Sie, dass die Verwendung von int für Array-Größen nicht die beste Idee ist.

+11

Was ist mit der Verwendung von 'size_t' für Größen falsch? Oder zumindest etwas ohne Vorzeichen? –

+0

'#define countof (a) ((Größe von (a)/sizeof ((a) [0])))' - Ich frage mich, ob es ein sicherer Weg ist, ein solches Makro zu deklarieren. Vor allem für mehrdimensionale Arrays und solche Sachen ... – leemes

+0

Ich glaube, sizeof wird immer zur Kompilierzeit berechnet. Ich kann mir keinen Weg vorstellen, eine bedeutungsvolle Größe von etwas zu bekommen, was zur Kompilierzeit nicht bekannt ist. – aragaer

13

Je kürzer und wohl sauberere Version aussehen würde, als

sizeof tbl/sizeof *tbl 

:)

+14

Das ist sicher strittig. – Justin

3

Ja, es wird Ihnen die Anzahl der Elemente in dem Array tb1 geben.

int n = sizeof(tbl)/sizeof(tbl[0]) 

Interpretation:

sizeof (TB1) wird die Größe der gesamten Anordnung ergibt, dh tb1 = 3 Bytes

sizeof (TB1 [0]) gibt die Größe des Zeichens als tb1 [0] gibt einen Zeichenwert (Wert bei Adresse tb1 + 0) = 1 Byte

Abteilung der beiden letztgenannten geben Ihnen 3 Elemente

+0

'tbl' ist ein Array von' char * ', kein Array von' char'. Wenn 'sizeof (char *) == 4 ', dann teilen Sie 12 Bytes mit 4 Bytes, ergeben Sie 3 * Array-Elemente *, nicht 3 Bytes. –

+0

Entschuldigung es ist ein Typoo, es sollte 3 Elemente nicht Bytes sein .. :) – Mahesh

+0

@ tbl ist immer noch kein Zeichen-Array. –