D'autres ont répondu à combien de malloc(0)
travaux. Je vais répondre à une des questions que vous avez demandé n'a pas encore reçu de réponse (je pense). La question est à propos de realloc(malloc(0), 0)
:
Qu'est - malloc(0)
de retour? La réponse serait-elle la même pour realloc(malloc(0),0)
?
La norme dit ceci à propos de realloc(ptr, size)
:
- si
ptr
est NULL
, il se comporte comme malloc(size)
,
- dans le cas contraire (
ptr
n'est NULL
), il libère l'ancien pointeur d'objet par ptr
et retourne un pointeur vers un nouveau tampon alloué. Mais si size
0, C89 dit que l'effet est équivalent à free(ptr)
. Il est intéressant de noter, je ne trouve pas que la déclaration C99 projet (n1256 ou n1336). En C89, la seule raisonnable de la valeur de retour dans ce cas serait NULL
.
Donc, il y a deux cas:
-
malloc(0)
retours NULL
sur une mise en œuvre. Ensuite, votre realloc()
appel est équivalent à realloc(NULL, 0)
. C'est l'équivalent de malloc(0)
à partir de ci-dessus (et c'est - NULL
dans ce cas).
-
malloc(0)
rendements non-NULL
. Alors, l'appel est équivalent à free(malloc(0))
. Dans ce cas, malloc(0)
et realloc(malloc(0), 0)
sont pas équivalentes.
Notez qu'il est un cas intéressant ici: dans le deuxième cas, lorsqu' malloc(0)
rendements non-NULL
sur le succès, il peut toujours renvoyer NULL
pour indiquer l'échec. Cela se traduit par un appel comme: realloc(NULL, 0)
, ce qui équivaut à un malloc(0)
, ce qui peut ou ne peut pas retourner NULL
.
Je ne suis pas sûr si l'omission en C99 est un oubli ou si elle signifie qu'en C99, realloc(ptr, 0)
pour les non-NULL
ptr
n'est pas équivalent à free(ptr)
. J'ai juste essayé cela avec gcc -std=c99
, et le ci-dessus est équivalent à free(ptr)
.
Edit: je crois que je comprends ce que votre confusion est:
Regardons un extrait de votre exemple de code:
ptr = malloc(0);
if (ptr == realloc(ptr, 1024))
Le ci-dessus n'est pas le même que malloc(0) == realloc(malloc(0), 1024)
. Dans le second, l' malloc()
appel est effectué à deux reprises, alors que dans le premier, tu es de passage a été allouée pointeur realloc()
.
Analysons le premier le premier code. En supposant malloc(0)
n'a pas de retour NULL
sur le succès, ptr
a une valeur valide. Lorsque vous effectuez realloc(ptr, 1024)
, realloc()
vous donne essentiellement un nouveau tampon de la taille de 1024, et l' ptr
devient non valide. Une mise en œuvre conforme peut renvoyer à la même adresse que l'on a déjà en ptr
. Donc, votre if
condition peut retourner la valeur true. (Notez, cependant, en regardant la valeur de ptr
après realloc(ptr, 1024)
peut être un comportement non défini.)
Maintenant, la question que vous posez: malloc(0) == realloc(malloc(0), 1024)
. Dans ce cas, supposons que les deux malloc(0)
LHS et RHS renvoie non-NULL
. Ensuite, ils sont garantis pour être différent. Aussi, la valeur de retour de malloc()
LHS n'a pas été free()
d encore, de sorte que toute les autres malloc()
, calloc()
ou realloc()
peut ne pas renvoyer cette valeur. Cela signifie que si vous avez écrit votre condition que:
if (malloc(0) == realloc(malloc(0), 1024)
puts("possible");
vous ne verrez possible
sur la sortie (à moins que les deux malloc()
et realloc()
échouer et renvoyer NULL
).
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
void *p1;
void *p2;
p1 = malloc(0);
p2 = realloc(p1, 1024);
if (p1 == p2)
puts("possible, OK");
/* Ignore the memory leaks */
if (malloc(0) == realloc(malloc(0), 1024))
puts("shouldn't happen, something is wrong");
return 0;
}
Sur OS X, mon code n'a pas de sortie de quelque chose quand je l'ai couru. Sur Linux, il imprime possible, OK
.