Errore realloc

di il
7 risposte

Errore realloc

Salve , perchè dopo aver inserito gli elementi nel vettore attraverso la scanf ottengo l'errore "Error in `./a.out': realloc(): invalid pointer: 0x00007fffa7795e78 " ? grazie.

questo è il codice:


#include <stdlib.h>
#include <stdio.h>
#define DIM 50
#define FINE 0

void AllocazioneVettore(float *vett);
void ReallocVettore(float *vett,int *ptr);
void LeggereSequenzaReali(float *vett,int *ptr);
int CalcolaMinimo(float *vett);
int CalcolaMassimo(float *vett);
int CalcolaMedia(float massimo,float minimo);
void IndividuareSequenzaConsecutivi(float *vett,float Sottoseq[DIM]);
int SommaElementiSottosequenza(float SottoSeq[DIM]);
void VerificaSeSommaEMinoreDiMedia(float media,float somma,float SottoSeq[DIM]);

int main(){

	float Massimo,Minimo,media,somma,SottoSeq[DIM];
	
	float vett;
	int ptr;
	

	AllocazioneVettore(&vett);
	LeggereSequenzaReali(&vett,&ptr);
	ReallocVettore(&vett,&ptr);
	Minimo = CalcolaMinimo(&vett);
	Massimo = CalcolaMassimo(&vett);
	media = CalcolaMedia(Minimo,Massimo);
	IndividuareSequenzaConsecutivi(&vett,SottoSeq);
	somma = SommaElementiSottosequenza(SottoSeq);
	VerificaSeSommaEMinoreDiMedia(media,somma,SottoSeq);

	system("pause");
	return 0;
}
void AllocazioneVettore(float *vett){

	vett = (float *) malloc (DIM * sizeof(float));
}

void LeggereSequenzaReali(float *vett,int *ptr){

	int i = 0;
	int trovato = 0;

	printf("inserisci sequenza:\n");

	while(i < DIM && trovato == 0){
		scanf("%f",(vett + i));

		if (*(vett + i) == FINE){
		     trovato = 1;
		}
		i = i + 1;
        }

	i = i - 1;
	*(vett + i) = FINE;

        *ptr = i ;

}

void ReallocVettore(float *vett,int *ptr){

	vett = (float *) realloc (vett, *ptr * sizeof(float));

}

int CalcolaMinimo(float *vett){

    int i = 0;
    int j = 0;
    float MIN;
    while (vett[i] != FINE && vett[j] != FINE){
    	if (vett[i] <= vett[j]){
    	   MIN = vett[i];
    	   j = j + 1;
       }else if (vett[i] > vett[j]){
    	   i = i + 1;
       }
    }

    printf("Min: %f\n",MIN);
    return MIN;
}

int CalcolaMassimo(float *vett){

    int i = 0;
    int j = 0;
    float MAX;
    while (vett[i] != FINE && vett[j] != FINE){
    	if (vett[i] >= vett[j]){
    	   MAX = vett[i];
    	   j = j + 1;
       }else if (vett[i] < vett[j]){
    	   i = i + 1;
       }
    }

    printf("Max: %f\n",MAX);
    return MAX;
}

int CalcolaMedia(float massimo,float minimo){
	float media = (massimo + minimo)/2;
	printf("Media: %f\n",media);
	return media;
}

void IndividuareSequenzaConsecutivi(float *vett,float Sottoseq[DIM]){

    int i = 0;
	while (vett[i] != FINE){
		if (vett[i] < vett[i+1]){
			Sottoseq[i] = vett[i];
		}
		i = i + 1;
	}
	Sottoseq[i] = vett[i];
	Sottoseq[i+1] = FINE;
}

int SommaElementiSottosequenza(float SottoSeq[DIM]){
	int i = 0;
	float somma = 0;
	while (SottoSeq[i] != FINE){
		somma = somma + SottoSeq[i];
		i = i + 1;
	}
	return somma;
}

void VerificaSeSommaEMinoreDiMedia(float media,float somma,float SottoSeq[DIM]){
	int i = 0;
	if (somma < media){
		while (SottoSeq[i] != FINE){
			printf("%f",SottoSeq[i]);
			i = i + 1;
		}
	}
}

7 Risposte

  • Re: Errore realloc

    Tanti errori ... ti propongo alcune correzioni ... solo per partire correttamente ... guarda le modifiche e correggi il resto ...
    
    void AllocazioneVettore(float **vett);
    void ReallocVettore(float **vett, int *ptr);
    void LeggereSequenzaReali(float *vett, int *ptr);
    
    int main() {
    	float *vett=NULL;
    	int ptr;
    
    	AllocazioneVettore(&vett);
    	LeggereSequenzaReali(vett, &ptr);
    	ReallocVettore(&vett, &ptr);
    
    	return 0;
    }
    
    void AllocazioneVettore(float **vett) {
    	*vett = (float *)malloc(DIM * sizeof(float));
    }
    
    void LeggereSequenzaReali(float *vett, int *ptr) {
    	int i = 0;
    	int trovato = 0;
    
    	printf("inserisci sequenza:\n");
    
    	while (i < DIM && trovato == 0) {
    		scanf("%f", (vett + i));
    
    		if (*(vett + i) == FINE) {
    			trovato = 1;
    		}
    		i = i + 1;
    	}
    
    	i = i - 1;
    	//*(vett + i) = FINE;   INUTILE E SBAGLIATO
    
    	*ptr = i;
    }
    
    void ReallocVettore(float **vett, int *ptr) {
    	*vett = (float *)realloc(*vett, *ptr * sizeof(float));
    }
    
  • Re: Errore realloc

    Perchè è necessario l'utilizzo del doppio puntatore?
  • Re: Errore realloc

    In C il passaggio degli argomenti ad una funzione avviene sempre per copia, ossia qualsiasi modifica ai parametri formali non avrà alcun effetto sui parametri attuali. L'unico modo quindi in cui una funzione f possa modificare una generica variabile n appartenente ad un ambito di visibilità (non globale) diverso da quello di f, è quello di accedere ad n attraverso il suo indirizzo di memoria (ossia &n). A questo punto risulta ovvio che, dovendo contenere &n, il tipo dell'argomento (chiamiamolo m) sarà un puntatore di un ordine superiore rispetto ad n.
    Per esempio:
    n = int ==> m = int*
    n = char ==> m = char*
    n = float* ==> m = float**
    n = double**** ==> m = double*****
  • Re: Errore realloc

    Si, quello mi è chiaro, però la cosa che non mi è chiara è perchè non posso dichiarare il vettore inizialmente come se fosse un reale ,e poi attraverso un puntatore che punta all'indirizzo della variabile reale vado ad allocare uno spazio in memoria.
    Questo è un esempio:
    
    #include <stdlib.h>
    #include <stdio.h>
    #define DIM 50
    
    void AllocazioneVettore(float *vett);
    void ReallocVettore(float *vett,int *ptr);
    
    
    int main(){
    
    	
    	float vett;
    	int ptr;
    	
    
    	AllocazioneVettore(&vett);
    
    	system("pause");
    	return 0;
    }
    void AllocazioneVettore(float *vett){
    
    	vett = (float *) malloc (DIM * sizeof(float));
    }
    
  • Re: Errore realloc

    Un vettore di float è una sequenza di tanti float in memoria e il primo elemento è indirizzato tramite un puntatore.
    Un float è una singola variabile già esistente in memoria.
  • Re: Errore realloc

    Ah ok grazie,invece per quanto riguarda la scrittura " *(vett + i) = FINE; " perchè è sbagliata?
    Dici che è inutile perchè nelle altre funzioni posso direttamente riportarmi la dimensione del vettore attraverso il puntatore int *ptr , giusto?
    int i = 0;
    	int trovato = 0;
    
    	printf("inserisci sequenza:\n");
    
    	while (i < DIM && trovato == 0) {
    		scanf("%f", (vett + i));
    
    		if (*(vett + i) == FINE) {
    			trovato = 1;
    		}
    		i = i + 1;
    	}
    
    	i = i - 1;
    	//*(vett + i) = FINE;   INUTILE E SBAGLIATO
    
    	*ptr = i;
    	
  • Re: Errore realloc

    1) non ha nessuno scopo (non serve a niente)

    2) va a occupare una posizione dell'array che non esiste con possibili crash del programma
Devi accedere o registrarti per scrivere nel forum
7 risposte