2011-03-29 3 views
-1

est-il possible de réaffecter la mémoire à partir d'un pointeur vers NULL dans C?c realloc de la mémoire de 0

int *v = 0; 
for(i = 0; i < 10; i++) 
    v = (int *) realloc(v, (i+1)*sizeof(int)); 
+0

Oui, mais ce code perd de la mémoire et perd vos données lorsque 'realloc' échoue. –

Répondre

2

Si ptr est NULL, l'appel est équivalent à malloc (taille), pour toutes les valeurs de taille. Source: man 3 realloc

2

« Dans le cas où ptr est NULL, la fonction se comporte exactement comme malloc, l'attribution d'un nouveau bloc d'octets de taille et de retourner un pointeur au début de celui-ci. »

http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/

Par ailleurs, je sais que ce code est seulement pour la question, mais vous devriez toujours vérifier la valeur de retour de realloc avant de mettre à jour votre pointeur:

int *p,*tmp; 

tmp = (int *)realloc(p, nBytes); 
if(tmp){ 
    p = tmp; 
} 
else{ 
    //Out of memory! 
} 

Si vous ne le faites pas, Vous perdrez votre référence à la mémoire allouée lorsque Realloc échoue.

+0

Bon indice, en gardant une référence à la mémoire allouée lors de l'utilisation de realloc() – Philip

0

de here

Si ptr est un pointeur null, realloc() se comporte comme malloc() pour la taille spécifiée.

+0

heh - semble que nous répondions tous à peu près en même temps: | – pentaphobe

0

De realloc man page:

realloc() change la taille du bloc de mémoire pointée par ptr d'octets de taille. Le contenu sera inchangé au minimum des anciennes et nouvelles tailles; la mémoire nouvellement allouée sera non initialisée. Si ptr est NULL, l'appel est équivalent à malloc (taille); Si la taille est égale à zéro, l'appel est équivalent à free (ptr). Sauf si ptr est NULL, il doit avoir été retourné par un appel antérieur à malloc(), calloc() ou realloc(). Si la zone pointée sur a été déplacée, un free (ptr) est fait.

1

De l'manpage:

Si ptr est NULL, l'appel est équivalent à malloc (taille); si la taille est égale à zéro, l'appel est équivalent à gratuit (ptr). Sauf si ptr est NULL, doit avoir été renvoyé par un appel antérieur à malloc(), calloc() ou realloc().

Cependant, vous ne devriez pas oublier que realloc() peut revenir NULL si elle ne peut pas redimensionner la mémoire. Le code que vous avez publié peut entraîner l'allocation de plus d'un bloc de mémoire si cela se produit, car la valeur de retour NULL sera renvoyée dans realloc() qui attribuera alors un nouveau bloc. (Nous espérons que vous n'êtes pas vraiment utiliser ce code en tout cas ...)

2

de la norme

7.20.3.4/3 ... Si ptr est un pointeur NULL, la fonction realloc se comporte comme le malloc fonction pour la taille spécifiée.