Realloc errore realloc(): invalid pointer: 0x00000...

di Anonimizzato18325 il
23 risposte
Ciao a tutti,
sto studiando il c per esame di laboratorio. Ho problemi con il realloc.. ho letto e mi sembrava di aver capito il funzionamento ma facendo un banalissimo esercizio ho l'errore che ho scritto in oggetto e non capisco perchè. Vi copio il programmino che ho fatto e che genera l'errore.. grazie per l'aiuto
******************************************************************************
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int *my_alloc(int n);
int *my_realloc(int *p, int n);
 
int main()
{
	 int *a,x,i,size;
	 
	 srand(time(NULL)); //inizializzo generatore casuale
	 printf("quanti elementi vuoi inserire?");
	 scanf("%d", &size);
	 a=my_alloc(size); //utilizzo funzione malloc per allocare spazio dinamicamente
	 
	 for (i=0; i<size;i++)
	 	{
	 		*a=(rand()%19-9)+i;
	 		printf("\nind %p e valore %d\n", a, *a);
	 		a++;
	 	}
   
	 printf("\nquanti elementi vuoi aggiungere?");
	 scanf("%d", &x);
	 
	 size+=x;
	 a = my_realloc(a,size); 
   for (i=0; i<size;i++)
	 	{
	 		*a=(rand()%19-9)+i;
	 		printf("\nind %p e valore %d\n", a, *a);
	 		a++;
	 	}	 	
	 free(a); 
   return 0;
}

int *my_alloc(int n)
{
  int *p;
  p=malloc(n* sizeof(int));
  if (p==NULL)
  	{
  		printf("Mermoria heap non suff!");
  		exit(EXIT_FAILURE);
  	}
  	else return p;
}
int *my_realloc(int *p, int n)
{
  int *newp=p;
	newp=realloc(p,n);

	if (newp==NULL)
	  {
	      printf("memoria insuff!");
	      exit(EXIT_FAILURE);
	  }
	else 
	{
	  return newp;
	}

}
******************************************************************************

23 Risposte

  • Alla realloc devi passare il valore originale del puntatore restituito dalla malloc (ovvero a), ma tu lo modifichi prima di passarlo.


    P.S. Usa i tag CODE per presentare il codice nel forum
  • Grazie della risposta.

    ma se si stanno inserendo valori e si ha la necessità di aumentare o diminuire il vettore nn posso farlo?
  • Non è quello che ti ho risposto io.
    Certo che puoi ma, ripeto, alla realloc devi passare il valore originale del puntatore restituito dalla malloc. Non è chiaro?
  • Hummm no non ho capito. Ho provato a passare indirizzo di a[0] ma ho lo stesso errore
  • Che c'entra a[0] ?

    Il puntatore è a

    Devi passare a alla realloc MA NON devi modificare a con a++ ... chiaro?
  • .... mettendo a = my_realloc(a-size,size+x); funziona quindi devo riportare il puntatore alla cella puntata all'inizio quando ho usato il malloc. Giusto?
    Adesso mi da un problema, non sempre ma ogni tanto, su free(a) messaggio di errore=>"free(): invalid next size (fast): 0x "
  • Metto il codice modificato:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int *my_alloc(int n);
    int *my_realloc(int *p, int n);
     
    int main()
    {
        int *a,x,i,size;
       
        srand(time(NULL)); //inizializzo generatore casuale
        printf("quanti elementi vuoi inserire?");
        scanf("%d", &size);
        a=my_alloc(size); //utilizzo funzione malloc per allocare spazio dinamicamente
       
        for (i=0; i<size;i++)
           {
              *a=(rand()%19-9)+i;
              printf("\nind %p e valore %d\n", a, *a);
              a++;
           }
        printf("\nquanti elementi vuoi aggiungere?");
        scanf("%d", &x);   
        a = my_realloc(a-size,size+x);
        for (i=0; i<x;i++)
           {
              *(a+size+i)=(rand()%19+33)+i;
              printf("\nind %p e valore %d\n", a+size+i, *(a+size+i));
           }   
        for (i=0; i<(size+x);i++)
          printf("\n valore %d=>%d\n", i, a[i]);    
    
        free(a);
        return 0;
    }
    
    int *my_alloc(int n)
    {
      int *p;
      p=malloc(n* sizeof(int));
      if (p==NULL)
         {
            printf("Mermoria heap non suff!");
            exit(EXIT_FAILURE);
         }
         else return p;
    }
    int *my_realloc(int *p, int n)
    {
       int *newp=p;
       newp=realloc(p,n);
    
       if (newp==NULL)
         {
             printf("memoria insuff!");
             exit(EXIT_FAILURE);
         }
       else
       {
         return newp;
       }
    
    }
    
  • Anche per la free vale la stessa cosa !

    NON usare il puntatore originale ma una sua copia per poterlo modificare. E usa il puntatore originale nella realloc/free
  • Mi sento tanto tonta in questo momento...
    ho provato a dichiarare un altro puntatore *b e poi dopo la malloc la realloc ho fatto b=a. Messo nei vari for il puntatore b e poi fatto free(a) ma non solo non funziona la free ma ho anche un "Segmentation fault"..
    quindi immagino di non aver capito il tuo suggerimento.
  • bramar78 ha scritto:


    Mi sento tanto tonta in questo momento...
    ho provato a dichiarare un altro puntatore *b e poi dopo la malloc la realloc ho fatto b=a. Messo nei vari for il puntatore b e poi fatto free(a) ma non solo non funziona la free ma ho anche un "Segmentation fault"..
    quindi immagino di non aver capito il tuo suggerimento.
    Pasticciare con i puntatori e' SEMPRE stramaledettamente delicato e rischioso

    E se non lo si fa con cognizione di causa, sapendo, quindi, ESATTAMENTE quello che si sta' facendo, si ottengono i mitici memory dump, segmentation fault, crash misteriosi, o, peggio ancora (MOOOLTO PEGGIO), comportamenti stranissimi, imprevedibili e misteriosi.

    A meno che non ci siano MOTIVI MORTALI, pena decapitazione e relativo licenziamento, ANCHE i programmatori con N-mila anni di esperienza evitano l'aritmetica dei puntatori come la lebbra .

    Il MIGLIOR sistema per evitare il 99.99999% questi problemi e' quello di NON TOCCARE il puntatore, ma vederlo SOLO come l'entry-point di un vettore, e accedere all'i-mo elemento del vettore SOLO mediante INDICE, usando la sintassi "vettore[ i ]".

    Con l'indice ci puoi fare quello che vuoi: incrementarlo, decreementarlo, farci le somme, ecc..

    Quindi, ricapitolando: NON TOCCATE I PUNTATORI

    (vabbe, il film era Per favore, non toccate le vecchiette ).
  • Ma appunto ... Perché usi a++ e il puntatore e non usi a con l'induce i che parte da 0 ?

    Comunque adesso qual è il codice aggiornato? A questo punto te lo correggo...
  • Ok capito... ho trasforamto il codice nel seguente modo:
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int *my_alloc(int n);
    int *my_realloc(int *p, int n);
     
    int main()
    {
        int *a;
        int x,i,size;
       
        srand(time(NULL)); //inizializzo generatore casuale
        printf("quanti elementi vuoi inserire?");
        scanf("%d", &size);
        a=my_alloc(size); //utilizzo funzione malloc per allocare spazio dinamicamente
        for (i=0; i<size;i++)
           {
              a[i]=(rand()%19-9)+i;
              printf("\nind %p e valore %d\n", &a[i], a[i]);
           }
        printf("\nquanti elementi vuoi aggiungere?");
        scanf("%d", &x);   
        a = my_realloc(a,size+x);
        for (i=0; i<x;i++)
           {
              a[size+i]=(rand()%19+33)+i;
              printf("\nind %p e valore %d\n", &a[size+i], a[size+i]);
           }   
        for (i=0; i<(size+x);i++)
          printf("\n valore %d=>%d\n", i, a[i]);    
    
        free(a);
        return 0;
    }
    
    int *my_alloc(int n)
    {
      int *p;
      p=malloc(n* sizeof(int));
      if (p==NULL)
         {
            printf("Mermoria heap non suff!");
            exit(EXIT_FAILURE);
         }
         else return p;
    }
    int *my_realloc( int *p, int n)
    {
       int *newp=p;
       newp=realloc(p,n);
    
       if (newp==NULL)
         {
             printf("memoria insuff!");
             exit(EXIT_FAILURE);
         }
       else
       {
         return newp;
       }
    
    }
  • E ...
  • Non va bene il codice che ho scritto?
Devi accedere o registrarti per scrivere nel forum
23 risposte