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

di il
23 risposte

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

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

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

    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
  • Re: Realloc errore realloc(): invalid pointer: 0x00000...

    Grazie della risposta.

    ma se si stanno inserendo valori e si ha la necessità di aumentare o diminuire il vettore nn posso farlo?
  • Re: Realloc errore realloc(): invalid pointer: 0x00000...

    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?
  • Re: Realloc errore realloc(): invalid pointer: 0x00000...

    Hummm no non ho capito. Ho provato a passare indirizzo di a[0] ma ho lo stesso errore
  • Re: Realloc errore realloc(): invalid pointer: 0x00000...

    Che c'entra a[0] ?

    Il puntatore è a

    Devi passare a alla realloc MA NON devi modificare a con a++ ... chiaro?
  • Re: Realloc errore realloc(): invalid pointer: 0x00000...

    .... 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 "
  • Re: Realloc errore realloc(): invalid pointer: 0x00000...

    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;
       }
    
    }
    
  • Re: Realloc errore realloc(): invalid pointer: 0x00000...

    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
  • Re: Realloc errore realloc(): invalid pointer: 0x00000...

    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.
  • Re: Realloc errore realloc(): invalid pointer: 0x00000...

    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 ).
  • Re: Realloc errore realloc(): invalid pointer: 0x00000...

    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...
  • Re: Realloc errore realloc(): invalid pointer: 0x00000...

    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;
       }
    
    }
  • Re: Realloc errore realloc(): invalid pointer: 0x00000...

    E ...
  • Re: Realloc errore realloc(): invalid pointer: 0x00000...

    Non va bene il codice che ho scritto?
Devi accedere o registrarti per scrivere nel forum
23 risposte