2013-06-03 8 views
11

Warum ist sizeof("Bill")5, aber sizeof(char) ist 1?Warum ist die Bytegröße einer Zeichenfolge länger als die Länge?

Sollte das nicht sizeof("Bill")4 sein, da die Länge der Zeichenfolge 4 Zeichen (4 x 1) ist?

Ich glaube, es kann etwas mit "Bill" zu tun haben ein Array von Zeichen, aber warum erhöht das die Byte-Größe?

+4

@ H2CO3 - Ich schließe mich - das ist einfach C-Programmierung, die in der Regel innerhalb der ersten paar Kapitel eines vernünftigen Programmierung Buch über C (oder C bedeckt ++) –

+7

Das ist kein Grund, diese Frage nicht als Ort zu verwenden, um eine gute kanonische Antwort zu schreiben und hoffentlich das Internet ein wenig zu verbessern. –

+2

@EdHeal Vielleicht wäre ein Votum für die Schließung ein gutes Zeichen für Ihre Zustimmung;) Ich stimme völlig zu, diese Frage passt sehr gut zu dem Begriff "keine Forschungsanstrengungen" in den FAQ. –

Antwort

22

C-Strings sind nullterminiert. Am Ende dieser Zeichenfolge befindet sich ein Nullbyte. Unter der Annahme, ASCII, sieht "Bill" wie dies in Erinnerung:

'B' 'i' 'l' 'l' '\0' 
0x42 0x69 0x6c 0x6c 0x00 

Von dem C-Standard, Abschnitt 6.4.5 Stringliterale Absatz 7:

In Übersetzungsphase 7, einen Byte oder Code Der Wert Null wird an jede Multibyte-Zeichenfolge angehängt, die sich aus einem String-Literal oder Literalen ergibt.

Wenn Sie eine Antwort von 4 für die Länge erhalten möchten, sollten Sie strlen("Bill") verwenden, anstatt sizeof.

Wenn Sie wirklich den Null-Terminator nicht wollen, ist das auch möglich, obwohl wahrscheinlich nicht ratsam. Diese Definition:

char bill[4] = "Bill"; 

wird bill enthält 'B', nur die Zeichen ohne Null-Terminator 'i', 'l' und 'l', ein 4-Byte-Array ergeben.

3

hat es eine 0 als Terminator Charakter, so seine B i l l 0