come invochi questa funzione?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; }
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:
così facendo x non viene modificatocodice:int* x = new int[5]; allunga(x, 5, 6);
a meno che tu non la invochi così
in pratica le cose stanno cosìcodice:x = allunga(x, 5, 6);
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
quando chiami la funzione viene allocata una variabile localecodice:Indirizzo - Contenuto [0xF000][x]->[0xFA00]
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
come vedi la x del main è rimasta intatta.codice:Indirizzo - Contenuto [0xEB00][x]->[0x4300] // variabile vista dalla funzione allunga [0xF000][x]->[0xFA00]
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.

Rispondi quotando