ProgrammierungBackend C Entwickler

Wie funktioniert der Operator sizeof in der Programmiersprache C und welche Fallstricke gibt es bei seiner Verwendung?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort

Der Operator sizeof wird verwendet, um die Größe eines Typs oder Objekts in Bytes zur Kompilezeit zu bestimmen. Er wird häufig zum Zuweisen von Speicher, Berechnen der Größen von Strukturen und Arrays benötigt.

Beispiel:

int a; printf("%zu ", sizeof(a)); // Größe der Variablen a vom Typ int printf("%zu ", sizeof(int)); // Größe des Typs int

Besonderheiten:

  • sizeof gibt size_t zurück, immer >= 0.
  • Für Arrays gibt sizeof(array) die Größe des gesamten Arrays zurück, nicht die Größe des Zeigers.
  • Beim Übergeben eines Arrays an eine Funktion verlieren Sie die Informationen über seine Größe.

Beispiel für einen Fallstrick:

void foo(int arr[]) { printf("%zu ", sizeof(arr)); // gibt die Größe des Zeigers aus, nicht des Arrays! } int arr[10]; foo(arr); // sizeof(arr) == 40 (gewöhnlich), sizeof(arr in foo) == 8 (gewöhnlich)

Fangfrage

Was gibt der Ausdruck sizeof('a') in der Programmiersprache C zurück?

Antwort: Obwohl 'a' wie ein char aussieht, ist das Ergebnis von sizeof('a') die Größe des Typs int, da eine Zeichenkonstante in C int ist.

Beispiel:

sizeof('a') // gewöhnlich 4, nicht 1

Beispiele für echte Fehler aufgrund von Unkenntnis der Feinheiten des Themas


Geschichte

Im Projekt wurde Speicher zum Kopieren eines Strings mit malloc(strlen(str) * sizeof(char)) zugewiesen, wobei das Nullzeichen vergessen wurde. Dies führte zu einem Verlust des letzten Bytes und Fehlern bei der Arbeit mit den Funktionen der Standardbibliothek zur Verarbeitung von Strings.

Geschichte

Ein Modul verwendete sizeof(arr) in einer Funktion, in der Erwartung, die Größe der gesamten Struktur zu erhalten, erhielt aber nur die Größe des Zeigers. Dies führte dazu, dass zu wenig Daten in den Speicher geschrieben wurden, was zu Heap-Korruption führte.

Geschichte

Ein Entwickler entschloss sich, sizeof('a') für die Speicherzuweisung für einen Buchstaben zu verwenden und erwartete 1 Byte, erhielt jedoch 4 (oder 8) — dies führte zu ineffizientem Speicherverbrauch und Problemen im Code, der auf der erwarteten Größe basierte.