Heim  >  Artikel  >  Backend-Entwicklung  >  Warum geben „strlen()' und „sizeof()' unterschiedliche Ergebnisse für die String-Initialisierung in C zurück?

Warum geben „strlen()' und „sizeof()' unterschiedliche Ergebnisse für die String-Initialisierung in C zurück?

DDD
DDDOriginal
2024-11-04 00:21:30875Durchsuche

Why do `strlen()` and `sizeof()` return different results for string initialization in C?

Verstehen der Diskrepanz in den Ergebnissen von strlen() und sizeof() für die String-Initialisierung

Bei der C-Programmierung gibt es oft eine Diskrepanz zwischen den Ergebnisse von strlen() und sizeof() beim Umgang mit Zeigern und Arrays, die als Strings initialisiert wurden. Dieses scheinbar widersprüchliche Verhalten kann durch das Verständnis der Natur von Zeigern und Arrays erklärt werden.

Betrachten Sie den bereitgestellten Beispielcode:

<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>

Die Ausgabe für diesen Code lautet:

7 4
7 8

Die unterschiedlichen Ergebnisse für strlen() und sizeof() ergeben sich aus der Tatsache, dass str1 ein Zeiger auf einen String ist, während str2 ein Array von Zeichen ist.

Sizeof() vs. Strlen( ) für Zeiger

sizeof() bestimmt die Größe des Datentyps in Bytes. Im Fall eines char-Zeigers wie str1 gibt sizeof auf einem 32-Bit-System 4 zurück (8 auf einem 64-Bit-System), da ein Zeiger 4 (oder 8) Bytes Speicher belegt. Allerdings gibt strlen die Länge der Zeichenfolge zurück, auf die der Zeichenzeiger zeigt. Da die Zeichenfolge „Sanjeev“ 7 Zeichen hat, gibt strlen 7 zurück.

Sizeof() vs. Strlen() für Arrays

Im Gegensatz dazu ist str2 ein Array von Charaktere. sizeof(str2) gibt die Größe des gesamten Arrays zurück, das sowohl die Zeichen als auch den Nullterminator enthält (wird automatisch zu allen C-Strings hinzugefügt). Daher gibt sizeof(str2) 8 zurück (die Anzahl der Zeichen in „Sanjeev“ plus das Null-Terminator). strlen(str2) gibt außerdem 7 zurück, was der Länge der Zeichenfolge ohne den Nullterminator entspricht.

Zusätzliche Überlegungen

Um den Unterschied weiter zu veranschaulichen, betrachten Sie Folgendes Code:

<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>

In diesem Fall ist str1 nun ein Zeiger, der auf den Anfang des Zeichenarrays str2 zeigt. Wie zuvor gibt strlen(str1) 7 und sizeof(str1) 4 zurück. Allerdings gibt strlen(str2) auch 7 zurück, während sizeof(str2) immer noch 8 zurückgibt. Dies liegt daran, dass str2 ein Array und die Größe eines Arrays bleibt wird durch die Anzahl der darin enthaltenen Elemente bestimmt, unabhängig davon, ob diese tatsächlich verwendet werden.

Das obige ist der detaillierte Inhalt vonWarum geben „strlen()' und „sizeof()' unterschiedliche Ergebnisse für die String-Initialisierung in C zurück?. 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