Sizeof(char[]) in C
Betrachten Sie diesen code:
char name[]="123";
char name1[]="1234";
Und dieses Ergebnis
The size of name (char[]):4
The size of name1 (char[]):5
Warum die Größe der char[]
ist immer plus eins?
Die strings sind NULL-terminiert, das erfordert ein zusätzliches byte.
InformationsquelleAutor | 2015-05-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als Michael darauf hingewiesen, in den Kommentaren die Zeichenketten werden beendet durch eine null. So in Erinnerung der erste string wird wie folgt Aussehen
wo
\0
ist ein single-char und hat den ASCII-Wert 0. Dann die oben genannten string in Größe 4.Wenn Sie hatte nicht das Endzeichen, wie würde man wissen, wo der string (oder
char[]
für diese Angelegenheit) endet? Ja, in der Tat eine andere Möglichkeit ist das speichern der Länge irgendwo. Einige Sprachen. C nicht.Erbsenzählerei auf "Dann die oben genannten string in Größe 4." wenn definiert, wie
char s= [] = "123\0";
es würde haben eine Größe von 5 ... 🙂InformationsquelleAutor TobiMcNamobi
Beachten Sie den Unterschied zwischen
sizeof
undstrlen
. Der erste ist ein operator gibt die Größe des gesamten Daten-Element. Die zweite ist eine Funktion zurückgibt, die die Länge der Zeichenfolge, die kleiner ist als diesizeof
(es sei denn, Sie haben es geschafft, string-überlauf), je nachdem, wie viel von den ihm zugewiesenen Raum tatsächlich benutzt wird.In deinem Beispiel
sizeof(name)
4 ist, weil der kündigende'\0'
, undstrlen(name)
3.Aber in diesem Beispiel:
sizeof(str)
ist 20, undstrlen(str)
3.Auch 'strlen' instanziert ist zur Zeit ausführen und so, wenn Sie ein array mit fester Größe (wie in dem Fall) es ist eine gute Idee, lieber 'sizeof', um zu sicheren kleinen Millisekunden-Programm Zeit.
Ich würde immer bevorzugen, die eine, die richtige, nicht die, die ist schneller. Und die Einsparungen werden Nanosekunden, nicht Millisekunden. Aber auch viele Compiler sind schlau genug um sich, dass in dem Beispiel strlen (str) ist 3, und es gibt keine Notwendigkeit, es zu nennen.
IMO sollte dies die akzeptierte Antwort, die so aussieht wie die OP nicht kennen den Unterschied und was Sie verwendet werden.
InformationsquelleAutor Weather Vane
In C sind strings als arrays gespeichert von
char
s. Mit einer anerkannten Endzeichen ('\0'
oder nur0
) können Sie übergeben Sie einen Zeiger auf die Zeichenfolge, mit keine Notwendigkeit für eine weitere meta-Daten. Wenn die Verarbeitung einer Zeichenfolge, die Sie Lesen chars aus dem Speicher zeigte auf, indem Sie den Zeiger, bis Sie auf die beenden-Wert.Als der array-Initialisierung mit einem string-literal:
ist äquivalent zu:
Wenn Sie möchten, dass Ihre array der Größe 3 (ohne abschließenden Charakter, wie Sie nicht speichern eine Zeichenfolge, die Sie verwenden möchten:
oder
(Dank alk)
was tun, wie Sie erwartet hatten.
char name[3] = "123"
.Danke, ich habe vergessen, dass man.
Obwohl char name[3] = "123" bedeutet, dass es keine abschließenden nul-Zeichen, das bedeutet zum Beispiel, strlen (name), die wahrscheinlich zum Absturz bringen, oder schlimmer.
ja. Obwohl die Absicht ist, erzeugen Sie ein array von chars ohne den null-terminator (und kein string), die Sie würde nicht erwarten, dass
strlen()
auf ihm ausgeführt werden. Persönlich, es sei denn, ich bin mit einem großen Maßstab-Anwendung und erste Ausrichtung oder cache-misses mit vielen arrays wie diese, ich werde nehmen gerne die extra char in mein array, so dass dies nicht geschehen würde, auch nicht versehentlich. Sollte ich wohl verwendet habenchar array[]
in meinen Beispielen (wie "name" schon sagt, eine Zeichenkette), aber ich habe zu halten, die Fragen zu benennen.InformationsquelleAutor Baldrickk
Weil es ein null-Zeichen, das an das Ende der Zeichenkette in C.
Wie hier in Ihrem Fall
InformationsquelleAutor Benison Sam
So
sizeof
gibt die Größe des Objekts und in diesem Fall ist das Objekt ein array ist, und es wird festgelegt, dass das array 4 bytes lang im ersten Fall und 5 Byte im zweiten Fall.InformationsquelleAutor Gopi
In C, string-Literale haben einen null-Endzeichen Hinzugefügt.
Saiten,
Aussehen:
Daher, die Größe ist immer plus eins. Halten Sie im Verstand beim Lesen von strings aus Dateien oder aus welcher Quelle auch immer, die variable, wo Sie speichern Ihren Text, sollte immer extra Platz für das null-Endzeichen.
Zum Beispiel, wenn Sie erwarten, zu Lesen, string, dessen maximale Größe ist 100, Ihre Puffer-variable, sollte die Größe der 101.
InformationsquelleAutor Evdzhan Mustafa
Einen
String
in C (und in vermutlich jeder Sprache gibt es - hinter den kulissen) ist ein array von Zeichen, die beendet wird durch\0
mit dem ASCII-Wert 0.Beim zuweisen von:
char arr[] = "1234";
weisen Sie einen string-Literale, die standardmäßig null-terminiert (\0
wird auch als null -) wie Sie sehen können hier.Zu vermeiden, eine null (vorausgesetzt, Sie wollen einfach nur ein array von
char
s und nicht ein string), können Sie erklären es folgendermaßenchar arr[] = {'1', '2', '3', '4'};
und das Programm wird sich so Verhalten, wie Sie es wünschen (sizeof(arr)
4).Das Wort "wahrscheinlich", sagte ich, ich bin mir nicht sicher - ich war mir eigentlich ziemlich sicher, dass es einige Programmiersprachen, wo die strings sind nicht null-terminiert ist.
InformationsquelleAutor Zach P
Jeder string ist terminiert mit dem char nullbyte '\0', welches add 1 Ihre Länge.
char name[3] = "123";
ist nicht NULL-terminiert ist.InformationsquelleAutor Victor de Quidt