2012-09-04 4 views
1

J'ai un programme simple, à des fins d'apprentissage, mais je continue d'obtenir null retourné quand je realloc de tableau alloué.realloc return null

#include <stdio.h> 

#include <stdlib.h> 


void main() 
{ 
    char *ptr, *retval; 

    ptr = (char *)calloc(10, sizeof(char)); 

    if (ptr == NULL) 
     printf("calloc failed\n"); 
    else 
     printf("calloc successful\n"); 

    retval = (char *)realloc(ptr, 5); 

    if (retval == NULL) 
     printf("realloc failed\n");  
    else 
     printf("realloc successful\n"); 

    free(ptr); 
    free(retval); 

} 

Je ne suis pas en mesure de réallouer, retval = (char *)realloc(ptr, 5); ce que je fais mal?

+3

Vous ne devriez pas libérer 'ptr'. – md5

+1

Est-ce supposé être du code C ou du code C++? –

+1

'void main' est un comportement indéfini (sauf si votre implémentation le définit) – pmg

Répondre

3

Il fonctionne comme prévu pour moi:

calloc successful 
realloc successful 
*** glibc detected *** double free or corruption 

Le code semble bien, en supposant la double libre était intentionnel. N'appelez pas free(ptr) puisque vous l'avez déjà publié en le réaffectant.

1

Cela fonctionne pour moi quand je le compile. Vous avez cependant un bug qui est que vous appelez "free (ptr)" lorsque la mémoire pointée par ptr n'est plus valide lorsque vous l'avez réallouée. C'est peut-être la même chose que retval mais dans ce cas vous le libérez deux fois.

+0

l'ai corrigé, merci –