Heim >Backend-Entwicklung >C++ >Warum liefern „strlen' und „sizeof' unterschiedliche Ergebnisse für die Zeiger- und Array-String-Initialisierung in C?

Warum liefern „strlen' und „sizeof' unterschiedliche Ergebnisse für die Zeiger- und Array-String-Initialisierung in C?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-01 00:42:28248Durchsuche

Why do `strlen` and `sizeof` give different results for pointer and array string initialization in C?

Zeiger vs. Array-String-Initialisierung: Diskrepanzen in strlen und sizeof

In der C-Programmierung kann die Verwendung von Zeigern und Arrays zur Initialisierung von Strings zu unerwarteten Ungleichheiten in der führen Ausgaben von strlen und sizeof. Lassen Sie uns dieses Phänomen anhand eines konkreten Beispiels analysieren.

Das bereitgestellte Code-Snippet:

<code class="c">char *str1 = "Sanjeev";
char str2[] = "Sanjeev";
printf("%d %d\n", strlen(str1), sizeof(str1));
printf("%d %d\n", strlen(str2), sizeof(str2));</code>

erzeugt die folgende Ausgabe:

7 4
7 8

Die Variationen entstehen aufgrund der grundlegende Unterschiede zwischen Zeigern und Arrays in ihrem Datentyp und der Objektgröße.

Zeiger (str1)

  • strlen(str1) gibt 7 zurück, was die Länge von darstellt die Zeichenfolge, auf die str1 zeigt (ohne den Nullterminator).
  • sizeof(str1) gibt 4 zurück, da str1 eine Zeigervariable mit einer 4-Byte-Speicheradresse (32-Bit-System) ist.

Array (str2)

  • strlen(str2) gibt unter Berücksichtigung der Länge der Zeichenfolge im Array ebenfalls 7 zurück.
  • sizeof( str2) gibt 8 zurück, da str2 ein Array ist, das acht Zeichen enthält, einschließlich des Null-Terminators.

Um diese Konzepte weiter zu veranschaulichen, ändern wir den Code leicht:

<code class="c">char str2[8];
strncpy(str2, "Sanjeev", 7);
char *str1 = str2;
printf("%d %d\n", strlen(str1), sizeof(str1));
printf("%d %d\n", strlen(str2), sizeof(str2));</code>

Dieser Code führt zu identischen Ergebnissen für str1 und str2 in Bezug auf strlen: 7. sizeof(str1) bleibt jedoch 4 und stellt die Speicheradresse dar, während sizeof(str2) sich auf 8 anpasst und weiterhin das nullterminierte Zeichen berücksichtigt.

Daher besteht die wichtigste Erkenntnis darin, die unterschiedlichen Datentypen und Größenmerkmale von Zeigern und Arrays zu verstehen, wenn in der C-Programmierung mit Zeichenfolgen gearbeitet wird.

Das obige ist der detaillierte Inhalt vonWarum liefern „strlen' und „sizeof' unterschiedliche Ergebnisse für die Zeiger- und Array-String-Initialisierung in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn