2010-06-24 1 views

Antwort

8

Wenn die Größe des Raumes angeforderten 0 ist, ist das Verhalten Implementierung definiert: Der Wert zurückgegeben wird entweder eine Null sein Zeiger oder ein eindeutiger Zeiger.

Quelle: malloc bei The Open Group

+0

+1 für den Link – neuro

2

Ich denke, die Adresse ist nur gültig, wenn Sie 0 Bytes davon verwenden möchten. Die Verwendung wahrscheinlich wäre, die nicht speziell auf die Fälle behandeln wie:

char * foo = malloc(size); 
// do something with foo 
free(foo); 
+0

Nun ja, aber Sie müssen sowieso einen NULL Rückgabewert behandeln und jeder vernünftige Programmierer wird einen kohärenten Wert der Größe an diesem Punkt oder nach dem malloc haben ... – neuro

+1

Es ist jedoch auch sicher, 'NULL' zu übergeben ['frei'] (http://pubs.opengroup.org/onlinepubs/009695399/functions/free.html). –

2

Es hat keine gültige Adresse zurück.

Das Ergebnis von malloc (0) ist Implementierung definiert und daher unzuverlässig.

Einige Compilerimplementierungen bewirken, dass ein NULL-Zeiger zurückgegeben wird, andere geben möglicherweise einen anderen Wert zurück (können jedoch nicht für den Zugriff auf den Speicher verwendet werden).

Der Speicher kann nicht verwendet werden (er kann jedoch frei sein).

+0

Sie haben Recht, dass es implementation-abhängig ist, aber malloc (0) gibt entweder NULL oder eine VALID-Adresse zurück (was bedeutet, dass Sie ohne segfault frei darauf zugreifen können). Also gibt es eine gültige Adresse zurück. Aber Sie haben recht, wenn Sie sagen, dass Sie es nicht benutzen sollten. Wie auch immer, jeder anständige Programmierer wird Code haben, der die Größe korrekt überprüft, es ist eine Art sinnlose Debatte;) Ich stimme dem überein, dass es einige spezifischere Überprüfungen speichern kann ... – neuro

0

Ich kann mir eine Verwendung nicht vorstellen, aber es ist wahrscheinlich das Ergebnis von mallocs Design: Wenn es einfacher ist, es zu unterstützen als es nicht zu unterstützen, sollte es unterstützt werden.

Wie es in Ordnung ist asin zu nehmen (4), und es gibt eine komplexe Zahl ... oops nein, es nicht ...

+1

Sie brauchen Casin, damit das Ergebnis komplex wird. –

+0

Was!? C unterstützt einen komplexen Typ nicht aus der Box? Was für eine Schande :-) – neuro

+1

@neuro Sie werden lachen, aber C unterstützt komplexe out of the box. C99 benötigt Compiler, um "komplex" als nativen Typ zu implementieren. –

2

Es ist nicht in C beauftragt (aber es hat den Auftrag für neu in C++). Es gibt Fälle, in denen Objekte keinen Status haben (und daher eine Nullgröße haben), aber ihre Identität ist wichtig. In einem solchen Fall wird ein Zuordner benötigt, der gültige und verschiedene Objekte für eine Größe von 0 zurückgibt, wenn Sie sie dynamisch zuordnen müssen.

+0

+1 für den Kommentar zum Objektstatus. Schade, dass solche Dinge von der Implementierung abhängig sind ... – neuro

+0

Wie Sie sagten, ist dies nutzlos, da es implementierungsabhängig ist. Wenn Sie eine so hässliche Methode zum Identifizieren einzelner Objekte der Größe Null verwenden möchten, übergeben Sie einfach "MIN (1, size)" an "malloc" und klopfen Sie sich auf die Rückseite, um mindestens 16 Bytes pro Identität zu verschwenden. –

Verwandte Themen