Originariamente inviato da Tigre851
Salve, la seguente funzione, dovrebbe "allungare" un array di interi... solo che la prima volta che la invoco con l'array x di un elemento e la nuova lunghezza pari a 5 tutto funziona correttamente, quando la invoco per la seconda volta con l' array di lunghezza 5 e nuova lunghezza 8 mi và in segmentation fault... e non capisco perchè...

codice:
int *allunga(int *x, int vl, int nl){ // vl--> vecchia lunghezza nl--> nuova lunghezza
	int j;
	int *q = new int[nl]; //creo il nuovo array, qui ottengo il segmentation fault
	for (j=0; j<vl; j++)
		q[j]= x[j]; //copio quello vecchio in quello nuovo
	for (j = vl; j< nl; j++)
		q[j] = -1;		
	delete []x; //cancello quello vecchio
	x = q; //faccio puntare x al nuovo array
	return x;
	}
come invochi questa funzione?
dovresti postare il main perché è corretta,
comunque, nella linea contrassegnata in blu,
l'array x punta si al vettore q, ma solo nell'ambito della funzione allunga.

es:
codice:
int* x = new int[5];

allunga(x, 5, 6);
così facendo x non viene modificato

a meno che tu non la invochi così

codice:
x = allunga(x, 5, 6);
in pratica le cose stanno così

prima di richiamre allunga, la variabile x starà in una certa
locazione di memoria, es 0xF000, il contenuto di x invece è
un puntatore al vettore che hai allocato in precedenza, es 0xFA00

codice:
Indirizzo  - Contenuto
[0xF000][x]->[0xFA00]
quando chiami la funzione viene allocata una variabile locale
x (parametro formale) nella funzione allunga, in un'altra
locazione, es 0xEB00, il valore è lo stesso della x
(parametro attuale) passata alla funzione, quindi 0xFA00

codice:
Indirizzo  - Contenuto
[0xEB00][x]->[0xFA00] // variabile vista dalla funzione allunga
[0xF000][x]->[0xFA00]

supponendo che q, nella funzione allunga, quando viene
allocato il vettore, punti a 0x4300, allora quando modifichi
x nella assegnazione
x = q

succede questo

codice:
Indirizzo  - Contenuto
[0xEB00][x]->[0x4300] // variabile vista dalla funzione allunga
[0xF000][x]->[0xFA00]
come vedi la x del main è rimasta intatta.

Tutto questo perchè stai passando la variabile x (che è un puntatore a int) per copia.
Visto che usi C++ puoi provare con il passaggio by reference (per riferimento)

void allunga(int* &x, int vl, int nl)

in questo caso le modifiche che farai sulla variabile x, si
ripercuoteranno anche alla x dichiarata nel main.

Comunque sarebbe utile se postassi il codice del main.