Errore realloc

di thomas99 il
7 risposte
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

  • 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));
    }
    
  • Perchè è necessario l'utilizzo del doppio puntatore?
  • 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*****
  • 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));
    }
    
  • 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.
  • 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;
    	
  • 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