2013-06-23 5 views
16

Ich habe ein Stück von C-Code und I nicht verstehen, wie die sizeof(...) Funktion arbeitet:Größe des Zeichenfeldes und die Größe des Zeichenzeigers

#include <stdio.h> 

int main(){ 
    const char firstname[] = "bobby"; 
    const char* lastname = "eraserhead"; 
    printf("%lu\n", sizeof(firstname) + sizeof(lastname)); 
    return 0; 
} 

In dem obigen Code sizeof (Vorname) 6 und sizeof (Nachname) ist 8.

Aber bobby ist 5 Zeichen breit und eraserhead ist 11 breit. Ich erwarte 16.

Warum verhält sich sizeof für das Zeichenarray und den Zeiger auf das Zeichen anders?

Kann jemand klären?

+5

Sowohl 'sizeof' als auch' strlen() 'geben ein Ergebnis vom Typ' size_t'. Verwenden Sie "% zu", nicht "% lu", um "size_t" -Werte zu drucken. Wenn der Compiler "% zu" nicht unterstützt, konvertieren Sie ihn in einen bekannten Typ und verwenden Sie das entsprechende Format für diesen Typ. –

Antwort

23

firstname ist ein char Array mit einem nachlaufenden 0-Terminator. lastname ist ein Zeiger. Auf einem 64-Bit-System sind Zeiger 8 Byte breit.

+0

Nun, es ist klar, dass OP versuchte, die Größe der Saite, also die Saitenlänge, herauszufinden und beide hinzuzufügen, wie er sagt: "Warum nicht 5 + 10 = 15?", Ist es wirklich möglich, Saitenlänge zu bekommen 'sizeof' oder' strlen() 'ist besser geeignet? Was sagst du? – 0decimal0

+2

@PHIfounder: Da ** eine "Zeichenkette" in C durch eine Folge von Zeichen repräsentiert wird, die durch ein ''\ 0'' Zeichen ** abgeschlossen sind, verwenden Sie' strlen() ', um die Länge einer Zeichenkette zu erhalten. Dies funktioniert sowohl bei "echten" Zeichenfeldern als auch bei Zeigern, die auf letzteres verweisen. In diesem Zusammenhang spielt es keine Rolle, wie und wo die Zeichen gespeichert sind. Tatsächlich muss die Variable, die die Zeichenfolge enthält, nicht unbedingt mit der Länge der "Zeichenfolge" übereinstimmen. Wenn andererseits die ** Menge der Bytes interessiert ist, die eine Variable für die Verwendung von ** deklariert, verwenden Sie den Operator 'sizeof'. – alk

+2

Und die Anzahl der Bytes, die benötigt werden, um einen String 's' zu speichern (oder mit' s' bezeichnet) ist 'strlen (s) + 1'. –

3

Die Größe Ihres ersten Arrays ist die Größe von bobby\0. \0 ist das Abschlusszeichen, also ist es 6.

Die zweite Größe ist die Größe eines Zeigers, der 8 Byte in Ihrem 64-Bit-System ist. Seine Größe hängt nicht von der Länge der zugewiesenen Zeichenfolge ab.

6

sizeof ein Array ist die Größe der gesamten Anordnung, in dem Fall von „Haarn“, es 5 Zeichen ist und ein \0 nachlauf die 6.

sizeof ein Zeiger gleich ist der Größe des Zeigers, das ist normalerweise 4 Bytes in 32-Bit-Maschine und 8 Bytes in 64-Bit-Maschine.

2

firstname[] ist nullterminiert, wodurch die Länge 1 hinzugefügt wird.

sizeof(lastname) gibt die Größe des Zeigers anstelle des tatsächlichen Werts.

+3

'* lastname' ist ein einzelnes' char', also wird 'sizeof * lastname' immer 1 sein. – caf

2

firstname ist ein Array von 6 chars, einschließlich der abschließenden '\0' Zeichen am Ende der Zeichenfolge. Das ist, warum sizeof firstname ist 6.

lastname ist ein Zeiger auf char, und wird, was auch immer Größe solch ein Zeiger auf Ihrem System hat. Typische Werte sind 4 und 8. Die Größe von lastname ist immer gleich, egal auf was es zeigt (oder auch wenn es überhaupt nichts anzeigt).