Heim >Backend-Entwicklung >C++ >Warum geben „strlen' und „sizeof' unterschiedliche Werte für die Zeiger- und Array-basierte String-Initialisierung in C zurück?

Warum geben „strlen' und „sizeof' unterschiedliche Werte für die Zeiger- und Array-basierte String-Initialisierung in C zurück?

Susan Sarandon
Susan SarandonOriginal
2024-11-01 07:14:02702Durchsuche

Why do `strlen` and `sizeof` return different values for pointer and array-based string initialization in C?

Unterschiedliche Antworten von strlen und sizeof für Zeiger- und Array-basierte Initialisierung von String [Duplikat]

In der Programmiersprache C beim Deklarieren von an Array und einem Zeiger auf einen String können mit den Funktionen „strlen“ und „sizeof“ unterschiedliche Ausgaben erzielt werden. Das Verständnis dieser Diskrepanz ist für eine effektive Speicherverwaltung und Datenverarbeitung von entscheidender Bedeutung.

Um diesen Unterschied zu veranschaulichen, betrachten Sie den folgenden Codeausschnitt:

char *str1 = "Sanjeev";
char str2[] = "Sanjeev";
printf("%d %d\n",strlen(str1),sizeof(str1));    
printf("%d %d\n",strlen(str2),sizeof(str2));

Die erzeugte Ausgabe wird sein:

7 4
7 8

Die Funktion „strlen“ gibt die Anzahl der Zeichen in der Zeichenfolge zurück, mit Ausnahme des Null-Terminators. In beiden Fällen enthält die Zeichenfolge 7 Zeichen. Die Funktion „sizeof“ hingegen gibt die Größe des Datentyps im Speicher zurück.

Für „str1“, einen Zeiger, gibt „sizeof(str1)“ die Größe der Zeigervariablen selbst zurück. Dies sind auf den meisten Systemen typischerweise 4 Byte. Dies liegt daran, dass „str1“ kein Array ist, sondern lediglich ein Zeiger auf die Zeichenfolge „Sanjeev“.

Im Gegensatz dazu ist „str2“ ein Array von Zeichen. „sizeof(str2)“ gibt die Größe des gesamten Arrays zurück, einschließlich des Nullterminators. Als Ergebnis werden 8 Bytes ausgegeben: 7 Bytes für die Zeichen und 1 Byte für den Nullterminator.

Um dieses Konzept besser zu verstehen, betrachten Sie den folgenden modifizierten Code:

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

Dies Zu diesem Zeitpunkt lautet die Ausgabe:

7 4
7 8

Auch wenn „str1“ und „str2“ auf dieselbe Zeichenfolge verweisen, bleiben die „sizeof“-Ausgaben gleich. Dies liegt daran, dass „str1“ immer noch ein Zeiger ist und „str2“ ein Array bleibt. Die 'strlen'-Ausgabe bleibt für beide 7, da nur die Zeichen in der Zeichenfolge gezählt werden.

Das obige ist der detaillierte Inhalt vonWarum geben „strlen' und „sizeof' unterschiedliche Werte für die Zeiger- und Array-basierte 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