2013-07-08 7 views
5

Ich habe C für ziemlich lange verwendet, und ich habe dieses triviale Problem, über das ich abfragen möchte.Ist Nullzeichen beim Verteilen mit malloc enthalten

Angenommen, ich möchte ein Zeichen-Array erstellen, das bis zu 1000 Zeichen speichert. Wenn ich jetzt malloc für dasselbe verwende, dann gebe ich die Größe des Arrays als 1001 Zeichen [1000 Zeichen + Null] oder nur 1000 an?

Wenn ich auch auf dieses Problem gestoßen bin, wie hätte ich dann die Antwort auf diese Lösung selbst finden können, vielleicht mithilfe einiger Testprogramme. Ich verstehe, dass die Größe der Zeichenfolge ohne das Nullzeichen berechnet wird, aber wenn ich den Speicher für das gleiche zuweise, berücksichtige ich auch das Nullzeichen?

Antwort

7

Wenn Sie diesen Block benötigen zum Speichern von nullterminierten String dann ja, Sie müssen explictly malloc() fragen zum Speichern der Null-Terminator ein zusätzliches Byte zuzuweisen, malloc() wird es sonst nicht für Sie tun. Wenn Sie beabsichtigen, die Zeichenfolgenlänge an einer anderen Stelle zu speichern, und Sie den Null-Terminator nicht benötigen, können Sie ohne das zusätzliche Byte zuordnen.Natürlich liegt es an Ihnen, ob Sie eine Null-Terminierung für Strings benötigen, vergessen Sie aber nicht, dass die C-Bibliotheks-String-Handhabungsfunktionen nur mit nullterminierten Strings arbeiten.

1

Sie müssen tatsächlich den Speicher für den Nullabschluss zuweisen.

Konzeptionell ist der Null-Terminator nur eine bequeme Möglichkeit, das Ende eines Strings zu markieren. Die C-Standardbibliothek nutzt diese Konvention beim Modellieren einer Zeichenfolge. Zum Beispiel berechnet strlen die Länge eines Strings, indem er den Speicher von der Eingabestelle (wahrscheinlich ein char *) untersucht, bis er einen Null-Terminator erreicht; aber der Null-Terminator selbst ist nicht in der Länge enthalten. Aber es ist immer noch Teil des von der Zeichenfolge verbrauchten Speichers.

1

Es liegt an Ihnen, das nullterminierende Zeichen anzugeben.

malloc reserviert Speicher für Sie, aber es setzt es auf nichts.

Wenn Sie strcpy auf den zugewiesenen Speicher dann haben Sie einen Null-Terminator für Sie bereitgestellt.

Alternativ können Sie calloc verwenden, da alle Elemente auf 0 gesetzt werden, was in Wirklichkeit der Nullabschluss ist. Dann, wenn Sie sagen, memcpy, müssten Sie nicht sorgen, um die Zeichenfolge ordnungsgemäß zu beenden.

+2

Sie müssen immer noch berücksichtigen, dass der Null-Terminator ein zusätzliches Byte benötigt. Wenn Ihre Zeichenfolge also 1000 Zeichen lang sein muss, ändert die Verwendung von "calloc()" nicht die Tatsache, dass Sie tausend und Ein Byte zum Speichern der Zeichenfolge. –

2

malloc und Familienzuweisung Speicher in Brocken von Bytes. Also, wenn Sie malloc(1000) tun, erhalten Sie 1000 Bytes. malloc ist nicht wichtig, wenn Sie diese 1000 Bytes zuweisen, um eine Zeichenfolge oder einen anderen Datentyp zu halten.

Da Zeichenfolgen in C aus einem Byte pro Zeichen bestehen und idealerweise Null-terminiert sein müssen, müssen Sie sicherstellen, dass Sie genügend Speicher haben, um das zu halten. Die Antwort lautet also: Ja, Sie müssen 1001 Bytes zuweisen, wenn Sie eine Zeichenfolge von 1000 Zeichen plus Nullabschluss halten möchten.

Erweiterter Tipp: Denken Sie auch daran, dass Sie je nach Verwendungszweck eine Zeichenfolge möglicherweise null terminieren müssen.

Wenn Sie zum Beispiel die genaue Länge der Zeichenfolge kennen, können Sie festlegen, dass, wenn es mit printf

printf("%*s", length, string); 

mit exakt length Zeichen Druck aus dem Puffer bei string hingewiesen.