2009-12-14 8 views
26

In C, ich habe ein Array von Strukturen wie definiert:Ergebnis von 'sizeof' auf Array von Strukturen in C?

struct D 
{ 
    char *a; 
    char *b; 
    char *c; 
}; 

static struct D a[] = { 
    { 
     "1a", 
     "1b", 
     "1c" 
    }, 
    { 
     "2a", 
     "2b", 
     "2c" 
    } 
}; 

ich die Anzahl der Elemente im Array bestimmen möchte, aber sizeof(a) gibt ein falsches Ergebnis: 48, nicht 2. Bin ich etwas zu tun falsch, oder ist sizeof hier einfach unzuverlässig? Wenn es wichtig ist, kompiliere ich mit GCC 4.4.

+0

Siehe http://stackoverflow.com/questions/1598773/is-there-a-standard-function-in-c-that-whould-return-the-length-of-an-array/1598827#1598827 für eine Antwort, die einige Hacks enthält, um die unten aufgeführten Techniken sicherer zu machen. –

Antwort

27
sizeof a/sizeof a[0]; 

Dies ist eine Kompilierung-Konstante, so dass Sie es zu, zum Beispiel verwenden können, um ein weiteres Array erstellen:

#define N sizeof a/sizeof a[0] 
int n_a[N]; 
+0

In diesem Fall, wenn sizeof (a) 48 ist, sizeof (a [0]) == 24. Das macht jedes char * 8 Bytes. sizeof (char *) ist wahrscheinlich entweder 4 oder 8, abhängig von 32-Bit/64-Bit, aber Compiler werden struct Mitglieder ausrichten, so dass jedes Element 8 Bytes lang wird. – jmanning2k

+1

Ja, aber das Schöne ist, die Division gibt die richtige Größe, ob es Padding gibt oder nicht, oder was auch immer die Größe der 'struct' ist. –

+0

#define sollte am Ende kein Semikolon haben – Paamand

37

sizeof Sie die Größe in Bytes gibt, nicht die Anzahl der Elemente. Um die Anzahl der Elemente zu erhalten, teilen Sie Alok wie folgt: Teilen Sie die Größe in Byte des Arrays durch die Größe eines Elements in Byte. Das korrekte C Idiom ist:

sizeof a/sizeof a[0] 
+7

+1 für eine bessere Erklärung. –

+10

Eine alternative, genau so idiomatische Version ist 'sizeof a/sizeof * a' – caf

7

sizeof gibt die Größe in dem Speicher des übergebenen Elements. Wenn Sie die Größe eines Arrays durch eine einzelne Elementgröße teilen, erhalten Sie die Anzahl der Elemente.

Beachten Sie, dass die Elementgröße auch einige Füllbytes enthalten kann. Aus diesem Grund wird eine gepolsterte Struktur (z. B. wenn ein Zeichenelement von einem Zeiger gefolgt wird) einen Wert größer als die Mitgliedergrößensumme haben.

Auf der anderen Seite, lassen Sie sich nicht stören, wenn Sie Elemente in einem Array zählen: sizeof(a)/sizeof(a[0]) wird immer noch so reibungslos wie erwartet arbeiten.