Problema deallocazione

di il
8 risposte

Problema deallocazione

Ciao ragazzi!
Ho un problema con la deallocazione di un vettore, ma non capisco dove sia il problema nel codice, qualcuno può aiutarmi?

#include <stdio.h>
#include <stdlib.h>

int lettura_dati(int *v, int n) {
	for (int i = 0; i < n; ++i) {
		scanf("%d", &v[i]);
		if (v[i] == 0)
			return i;
	}
	return n;
}

int *estrae_valori(int *vettoreIngresso1, int *vettoreIngresso2, int dim1, int dim2, int *dim) {
	int *vettoreUscita;
	int j = 0;
	int k = 0;
	for (int i = 0; i < dim1; i++) {
		if (vettoreIngresso1[i] > 0)
			*dim = *dim + 1;
	}

	for (int i = 0; i < dim2; i++) {
		if (vettoreIngresso2[i] < 0)
			*dim = *dim + 1;
	}
	vettoreUscita = (int*)malloc(*dim * sizeof(int));
	printf("%d", *dim);
	for (int i = 0; i < dim1; i++) {
		if (vettoreIngresso1[i] > 0) {
			vettoreUscita[k] = vettoreIngresso1[i];
			k++;
		}
	}
	for (int i = 0; i < dim2; i++) {
		if (vettoreIngresso2[i] < 0) {
			vettoreUscita[k + j] = vettoreIngresso2[i];
			j++;
		}
	}
	return vettoreUscita;
}

void stampa(int v[], int dim) {
	for (int i = 0; i < dim; i++) {
		printf("Elemento di indice %d: %d", i, v[i]);
		printf("\n");
	}
}

int main(void) {
	int *v1;
	int *v2;
	int *vR;
	int dim1;
	int dim2;
	int dimR = 0;

	printf("\nInserire la dimensione massima di v1: ");
	scanf("%d", &dim1);
	printf("\nInserire la dimensione massima di v2: ");
	scanf("%d", &dim2);

	dim1 = lettura_dati(&v1, dim1);
	dim2 = lettura_dati(&v2, dim2);

	vR = estrae_valori(&v1, &v2, dim1, dim2, &dimR);
	stampa(vR, dimR);

	free(vR);
	free(v1);
	free(v2);

	return 0;
}
In particolare mi dà errore la deallocazione del vettore v1. Non capisco perché il vettore vR invece non dà problemi.
Grazie in anticipo e che la Forza sia con voi

8 Risposte

  • Re: Problema deallocazione

    Quando allochi v1 e v2?
  • Re: Problema deallocazione

    Hai ragione ho scordato di allocare v1 e v2!
    Ho aggiunto questo
    v1 = (int*)malloc(sizeof(int));
    	v2 = (int*)malloc(sizeof(int));
    subito dopo le definizioni del main, ma continua a darmi lo stesso errore quando faccio free(v1)
  • Re: Problema deallocazione

    Perché allochi un int solo quando vuoi usare v1 come un array di int di dimensione a scelta dell'utente?
  • Re: Problema deallocazione

    Infatti ... tu allochi un intero e non dim1 o dim2 interi....

    Ti rendi conto dell'errore?
  • Re: Problema deallocazione

    Penso di aver capito, è stato un errore di disattenzione scusate.
    
    #include <stdio.h>
    #include <stdlib.h>
    
    int lettura_dati(int *v, int n) {
    	for (int i = 0; i < n; ++i) {
    		scanf("%d", &v[i]);
    		if (v[i] == 0)
    			return i;
    	}
    	return n;
    }
    
    int *estrae_valori(int *vettoreIngresso1, int *vettoreIngresso2, int dim1, int dim2, int *dim) {
    	int *vettoreUscita;
    	int j = 0;
    	int k = 0;
    	for (int i = 0; i < dim1; i++) {
    		if (vettoreIngresso1[i] > 0)
    			*dim = *dim + 1;
    	}
    
    	for (int i = 0; i < dim2; i++) {
    		if (vettoreIngresso2[i] < 0)
    			*dim = *dim + 1;
    	}
    	vettoreUscita = (int*)malloc(*dim * sizeof(int));
    	printf("%d", *dim);
    	for (int i = 0; i < dim1; i++) {
    		if (vettoreIngresso1[i] > 0) {
    			vettoreUscita[k] = vettoreIngresso1[i];
    			k++;
    		}
    	}
    	for (int i = 0; i < dim2; i++) {
    		if (vettoreIngresso2[i] < 0) {
    			vettoreUscita[k + j] = vettoreIngresso2[i];
    			j++;
    		}
    	}
    	return vettoreUscita;
    }
    
    void stampa(int v[], int dim) {
    	for (int i = 0; i < dim; i++) {
    		printf("Elemento di indice %d: %d", i, v[i]);
    		printf("\n");
    	}
    }
    
    int main(void) {
    	int *v1;
    	int *v2;
    	int *vR;
    	int dim1;
    	int dim2;
    	int dimR = 0;
    
    
    
    	printf("\nInserire la dimensione massima di v1: ");
    	scanf("%d", &dim1);
    	printf("\nInserire la dimensione massima di v2: ");
    	scanf("%d", &dim2);
    
    	v1 = (int*)malloc(dim1*sizeof(int));
    	v2 = (int*)malloc(dim2*sizeof(int));
    
    	dim1 = lettura_dati(&v1, dim1);
    	dim2 = lettura_dati(&v2, dim2);
    
    	vR = estrae_valori(&v1, &v2, dim1, dim2, &dimR);
    	stampa(vR, dimR);
    
    	free(vR);
    	free(v1);
    	free(v2);
    
    	return 0;
    }
    In questo modo dovrebbe andare, però quando faccio free(v1) continua a darmi questo errore
    "Eccezione generata in corrispondenza di 0x5233AACD (ucrtbased.dll) in Project1.exe: 0xC0000005: violazione di accesso durante la lettura del percorso 0xFFFFFFFE."
  • Re: Problema deallocazione

    Lem ha scritto:


    In questo modo dovrebbe andare, però quando faccio free(v1) continua a darmi questo errore
    "Eccezione generata in corrispondenza di 0x5233AACD (ucrtbased.dll) in Project1.exe: 0xC0000005: violazione di accesso durante la lettura del percorso 0xFFFFFFFE."
    Però devi studiare bene i puntatori prima di fare tentativi e sperare che vada. E' giusta secondo te la chiamata "lettura_dati(&v1, dim1);" ?
  • Re: Problema deallocazione

    La lettura_dati va chiamata con v1 e v2 non con &v1 e &v2

    In effetti se non studi le basi dell'utilizzo dei puntatori non finirai mai di scrivere questo semplice codice
  • Re: Problema deallocazione

    Sì esatto, ho trovato questo errore anche in estrae_valori. Posto il codice completo funzionante se dovesse servire a qualcuno!
    
    #include <stdio.h>
    #include <stdlib.h>
    
    int lettura_dati(int *v, int n) {
    	for (int i = 0; i < n; ++i) {
    		scanf("%d", &v[i]);
    		if (v[i] == 0)
    			return i;
    	}
    	return n;
    }
    
    int *estrae_valori(int *vettoreIngresso1, int *vettoreIngresso2, int dim1, int dim2, int *dim) {
    	int *vettoreUscita;
    	int j = 0;
    	int k = 0;
    	for (int i = 0; i < dim1; i++) {
    		if (vettoreIngresso1[i] > 0)
    			*dim = *dim + 1;
    	}
    
    	for (int i = 0; i < dim2; i++) {
    		if (vettoreIngresso2[i] < 0)
    			*dim = *dim + 1;
    	}
    	vettoreUscita = (int*)malloc(*dim * sizeof(int));
    	printf("%d", *dim);
    	for (int i = 0; i < dim1; i++) {
    		if (vettoreIngresso1[i] > 0) {
    			vettoreUscita[k] = vettoreIngresso1[i];
    			k++;
    		}
    	}
    	for (int i = 0; i < dim2; i++) {
    		if (vettoreIngresso2[i] < 0) {
    			vettoreUscita[k + j] = vettoreIngresso2[i];
    			j++;
    		}
    	}
    	return vettoreUscita;
    }
    
    void stampa(int v[], int dim) {
    	for (int i = 0; i < dim; i++) {
    		printf("Elemento di indice %d: %d", i, v[i]);
    		printf("\n");
    	}
    }
    
    int main(void) {
    	int *v1;
    	int *v2;
    	int *vR;
    	int dim1;
    	int dim2;
    	int dimR = 0;
    
    
    
    	printf("\nInserire la dimensione massima di v1: ");
    	scanf("%d", &dim1);
    	printf("\nInserire la dimensione massima di v2: ");
    	scanf("%d", &dim2);
    
    	v1 = (int*)malloc(dim1*sizeof(int));
    	v2 = (int*)malloc(dim2*sizeof(int));
    
    	dim1 = lettura_dati(v1, dim1);
    	dim2 = lettura_dati(v2, dim2);
    
    	vR = estrae_valori(v1, v2, dim1, dim2, &dimR);
    	stampa(vR, dimR);
    
    	free(vR);
    	free(v1);
    	free(v2);
    
    	return 0;
    }
    Grazie mille per l'aiuto
Devi accedere o registrarti per scrivere nel forum
8 risposte