Segmentation fault su funzione realloc

di il
3 risposte

Segmentation fault su funzione realloc

Salve a tutti, cercando di utilizzare la funzione "realloc", per risolvere un problema, mi sono imbattuto su un errore di segmentazione, Allora ho deciso di fare un programmino (che pensavo mi riuscisse essendo molto banale) che prendesse da input:
un intero che sarebbe la lunghezza dell'array,
i primi elementi dell'array,
un altro intero che fosse la nuova lunghezza dell'array in modo da aumentare le dimensioni dell'array,
gli altri elementi dell'array.
Infine volevo che mi stampasse tutti gli elementi dell'array, però eseguendo il programma mi da sempre segmentation fault .

Questo è il codice del programma, grazie in anticipo a chiunque saprà dirmi dove sbaglio .
#include <stdio.h>
#include <stdlib.h>

void input_array(int* a, int start, int len);
void output_array(int* a, int len);

int main() {
	int* a;
	int new;
	int len;


	printf("Lunghezza array : ");
	scanf("%d", &len);
	printf("\n");

	input_array(a, 0, len);

	printf("Nuova lunghezza: ");
	scanf("%d", &new);
	printf("\n");
	
	//______________________________________________ riallocamento memoria in un nuovo array

	a = (int*) realloc(a, new * sizeof(int));


	//______________________________________________ nuovo input e output

	input_array(a, len, new);

	output_array(a, new);


	return 0;
}

//___________________________________________________ input array
void input_array(int* a, int start, int len) {
	int num;

	a = malloc(len * sizeof(int));

	printf("Elementi dell\'array:\n");

	for (int i = start; i < len; ++i)
	{
		scanf("%d", &num);
		a[i] = num;
	}

}



//___________________________________________________ output array
void output_array(int* a, int len){
	for (int i = 0; i < len; ++i)
	{
		printf("%d\n", a[i]);
	}
}

3 Risposte

  • Re: Segmentation fault su funzione realloc

    Porrei la riga:
    a = malloc(len * sizeof(int));
    immediatamente dopo la prima "scanf( )" e la toglierei dalla funzione "input_array( )", giacché quella riga con la seconda chiamata della funzione "input_array( )" - ossia dopo la riallocazione della memoria - torna ad allocare una nuova area di memoria puntata dal Puntatore "* a", inficiando così la riallocazione appena prima compiuta con "realloc( )".

    Infine prima del "return" inserirei la funzione "free( )" per liberare l'area di memoria precedentemente riservata.
  • Re: Segmentation fault su funzione realloc

    Ciao,
    commetti un errore nella tua funzione input_array: quando passi il puntatore 'a' stai passando un indirizzo di memoria (non meglio specificato visto che non hai inizializzato 'a' nel tuo main). Tu ti aspetti di ritrovarti nella variabile 'a' del main, dopo la chiamata alla funzione input-array, il puntatore alla porzione di memoria allocata nella funzione stessa con i valori richiesti da tastiera, ma non stai facendo questo.
    Quando chiami la funzione passi il puntatore e, ricordando che comunque il passaggio di parametri a funzione è sempre by value, stai copiando il valore del puntatore 'a' (del main) nel puntatore 'a' (della funzione) per poi sovrascrivere questo valore con la malloc, che appunto torna un puntatore.

    Possibili soluzioni:
    -Passa un doppio puntatore a input_array e poi scrivi *a=malloc(...), in questo modo modificherai anche 'a' del main;
    -Fai in modo che la funzione input_array ritorni un int* e aggiungi alla fine della stessa "return a", e nella chiamata "a=input_array(...)"
  • Re: Segmentation fault su funzione realloc

    Grazie mille
Devi accedere o registrarti per scrivere nel forum
3 risposte