PDA

View Full Version : [C] Veloce chiarimento su stringhe e puntatori


Diablix
31-05-2008, 20:44
Lo so che è una domanda banale, anzi proprio stupida, però finora ho quasi sempre programmato in Java e Javascript e devo ancora metabolizzare completamente i puntatori...

Allora, devo fare questa funzione:

char ** clessidra(char * tab[N][N], int *dimris)

in pratica devo restituire un vettore v di stringhe.
Se io lo dichiaro così:

char * v[2*N];
....
return v;

Mi restituisce il seguente errore: warning: function returns address of local variable

Se però io faccio così:

char * v[2*N];
char ** aux;

...

aux = v;
return aux;


Tutto funziona a meraviglia, non solo in fase di compilazione ma anche di run-time.
Qualcuno gentilmente mi spiegherebbe perchè nel secondo modo funziona e nel primo no?
So che è di una banalità imbarazzante, ma proprio mi sfugge :doh:

E soprattutto, cosa devo fare per eliminare quell'obrobrio di aux?

Grazie infinite in anticipo.

Diablix
31-05-2008, 20:53
Sì, sì, è una costante dichiarata con un #define N 4

Xfight
31-05-2008, 22:47
La sintassi giusta sarebbe di allocare con una malloc la memoria che serve e poi farla puntare da un puntatore...

Facendo :
char * v[2*N];
....
return v;

(mi sembra) si crea l'area di memoria ma il puntatore resta in qualche modo vincolato alla località della funzione e non può essere passato.

Spero di non aver detto caxxate ^^

Bye

DanieleC88
01-06-2008, 16:21
Le variabili locali di una funzione risiedono nel record di attivazione di tale funzione, che è posto sullo stack di sistema. Quando esci da quella funzione, il puntatore ad una variabile interna restituirà un indirizzo sullo stack. Se nessuno ha usato quello spazio, tutto funziona ancora bene, ma se venisse sovrascritto da una successiva chiamata a funzione? Cosa conterrebbe quella memoria? :)

Usa l'allocazione dinamica della memoria, e ricorda di chiamare free() ogni volta che devi deallocare memoria. Abituati a farlo, che è importante, l'altro giorno avevo dimenticato di mettere una free() in un ciclo infinito e ho sentito l'hard disk swappare dopo 3 secondi. :D

DanieleC88
01-06-2008, 17:40
È dovuto al fatto che probabilmente accede a quel valore dopo il ritorno dalla funzione, senza chiamarne altre nel frattempo. Se ne avesse chiamato qualcun'altra dopo del ritorno, ne avrebbe sovrascritto lo spazio sullo stack.