Frage

Betrachten Sie folgenden Code ein:

char str[] = "Hello\0";

Was ist die Länge von str-Array und mit wie viel 0s es endet?

War es hilfreich?

Lösung

sizeof str ist. 7 - fünf Bytes für den "Hallo" Text sowie die explizite NUL Terminator, sowie die implizite NUL Terminator

strlen(str) ist. 5 - die fünf "Hallo" Bytes nur

Der Schlüssel hier ist, dass die implizite nul Terminator ist immer hinzugefügt - auch wenn die Stringliteral nur mit \0 Ende passieren. Natürlich hält strlen nur beim ersten \0 - es nicht sagen, der Unterschied kann

.

Es gibt eine Ausnahme zu der impliziten NUL Terminator Regel - wenn Sie explizit der Array-Größe angeben, wird die Zeichenfolge fit abgeschnitten:

char str[6] = "Hello\0"; // strlen(str) = 5, sizeof(str) = 6 (with one NUL)
char str[7] = "Hello\0"; // strlen(str) = 5, sizeof(str) = 7 (with two NULs)
char str[8] = "Hello\0"; // strlen(str) = 5, sizeof(str) = 8 (with three NULs per C99 6.7.8.21)

Dies ist jedoch selten nützlich, und anfällig für die String-Länge und mit einer Fehleinschätzung nicht abgeschlossenen String enden. Es ist auch in C ++ verboten.

Andere Tipps

Die Länge des Arrays ist 7, die NUL-Zeichen \0 noch zählt als Charakter und die Saite immer noch mit einem impliziten \0

beendet wird

Siehe Link ein funktionierendes Beispiel sehen

Beachten Sie, dass Sie hatte erklärt str als char str[6]= "Hello\0"; die Länge 6 sein würde, weil die implizite NUL nur hinzugefügt wird, wenn es passt (was es nicht kann in diesem Beispiel).

§ 6.7.8 / p14
Eine Reihe von Zeichentyp kann durch ein initialisiert werden Zeichenkettenliteral, gegebenenfalls in Klammern gesetzt. Sukzessive Zeichen der Zeichenkette der abschließenden literal (einschließlich Nullzeichen , wenn es Raum oder wenn das Array mit unbekannter Größe) initialisiert die Elemente des Arrays.

Beispiele

char str[] = "Hello\0"; /* sizeof == 7, Explicit + Implicit NUL */
char str[5]= "Hello\0"; /* sizeof == 5, str is "Hello" with no NUL (no longer a C-string, just an array of char). This may trigger compiler warning */
char str[6]= "Hello\0"; /* sizeof == 6, Explicit NUL only */
char str[7]= "Hello\0"; /* sizeof == 7, Explicit + Implicit NUL */
char str[8]= "Hello\0"; /* sizeof == 8, Explicit + two Implicit NUL */

Banging meine übliche Drum-Solo von IT VERSUCHEN , hier, wie Sie Fragen wie diese in Zukunft beantworten können:

$ cat junk.c
#include <stdio.h>

char* string = "Hello\0";

int main(int argv, char** argc)
{
    printf("-->%s<--\n", string);
}
$ gcc -S junk.c
$ cat junk.s

... die nicht benötigten Teile eliding ...

.LC0:
    .string "Hello"
    .string ""

...

.LC1:
    .string "-->%s<--\n"

...

Hinweis hier, wie die Saite, die ich für printf verwendet wird, ist nur "-->%s<---\n" während der globale Zeichenfolge in zwei Teilen: "Hello" und "". Der GNU-Assembler endet auch Saiten mit einem impliziten NUL Charakter, so dass die Tatsache, daß die erste Saite (.LC0) in diesen beiden Teilen ist, zeigt an, dass es zwei NULs. Der String ist somit 7 Bytes lang. Im Allgemeinen, wenn Sie wirklich wissen wollen, was den Compiler mit einem gewissen großen Stück Code zu tun, isoliert sie in einem Dummy Beispiel wie diese und sehen, was es mit -S tun (für GNU - MSVC hat eine Fahne zu für Assembler ausgegeben, aber ich don ‚t wissen, dass es off-Hand). Sie werden eine Menge darüber, wie Ihr Code funktioniert lernen (oder nicht zu arbeiten, wie der Fall sein kann), und Sie werden eine Antwort schnell erhalten, dass 100% garantiert ist, die Werkzeuge und Umgebung anzupassen in dem Sie arbeiten.

Im Einzelnen möchte ich eine Situation nennen, mit denen Sie verwirren.

Was ist der Unterschied zwischen "\ 0" und ""?

Die Antwort ist, dass "\0" steht in Array ist {0 0} und "" ist {0}.

Da "\0" ist immer noch ein Stringliteral und es wird auch "\0" am Ende hinzufügen. Und "" ist leer, aber auch "\0" hinzuzufügen.

Aus diesem Verständnis wird Ihnen helfen, zu verstehen "\0" tief.

Was ist die Länge von str-Array und mit wie viel 0s es endet?

Finden wir es heraus:

int main() {
  char str[] = "Hello\0";
  int length = sizeof str / sizeof str[0];
  // "sizeof array" is the bytes for the whole array (must use a real array, not
  // a pointer), divide by "sizeof array[0]" (sometimes sizeof *array is used)
  // to get the number of items in the array
  printf("array length: %d\n", length);
  printf("last 3 bytes: %02x %02x %02x\n",
         str[length - 3], str[length - 2], str[length - 1]);
  return 0;
}
char str[]= "Hello\0";

Das wäre 7 Byte sein.

Im Speicher würde es sein:

48 65 6C 6C 6F 00 00
H  e  l  l  o  \0 \0

Edit:

  • Was bedeutet das \ 0 Symbol Mittelwert in einem C-String?
    Es ist das „Ende“ eine Zeichenkette. Ein Null-Zeichen. In Speicher, es ist eigentlich eine Null. In der Regel Funktionen, dass Griff char-Arrays suchen Sie nach diesem Zeichen, da dies das Ende der Nachricht ist. Ich werde ein Beispiel am Ende setzen.

  • Was ist die Länge von str Array? (Beantwortet vor dem Bearbeitungsteil)
    7

  • und mit wie viel 0s es endet?
    Sie Array hat zwei „Räume“ mit Null; str [5] = str [6] = '\ 0' = 0

Zusatz Beispiel:
Nehmen wir an, Sie haben eine Funktion, die den Inhalt dieses Textes Array druckt. Man könnte definiert es als:

char str[40];

Nun können Sie den Inhalt des Arrays ändern (Ich werde kommen nicht in den Details, wie man), so dass er die Nachricht enthält: „Das ist nur ein Drucktest“ In Speicher, sollten Sie so etwas wie:

54 68 69 73 20 69 73 20 6a 75 73 74 20 61 20 70 72 69 6e 74
69 6e 67 20 74 65 73 74 00 00 00 00 00 00 00 00 00 00 00 00

So drucken Sie diesen char-Array. Und dann wollen Sie eine neue Nachricht. Sagen wir einfach „Hallo“

48 65 6c 6c 6f 00 73 20 6a 75 73 74 20 61 20 70 72 69 6e 74
69 6e 67 20 74 65 73 74 00 00 00 00 00 00 00 00 00 00 00 00

Beachten Sie die 00 auf Str [5]. Das ist, wie die Druckfunktion wird wissen, wie viel es braucht, um tatsächlich zu senden, trotz der tatsächlichen Länge des Vektors und den gesamten Inhalt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top