|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jun 2005
Messaggi: 836
|
[C] Veloce chiarimento su stringhe e puntatori
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 E soprattutto, cosa devo fare per eliminare quell'obrobrio di aux? Grazie infinite in anticipo. Ultima modifica di Diablix : 31-05-2008 alle 20:46. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jun 2005
Messaggi: 836
|
Sì, sì, è una costante dichiarata con un #define N 4
|
|
|
|
|
|
#3 |
|
Member
Iscritto dal: May 2006
Messaggi: 229
|
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
__________________
Una volta eliminato l'impossibile, quello che resta, per improbabile che sia, dev'essere la verità http://timestop.netsons.org/ -> il blog sull'informatica |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
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.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
È 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.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:46.



















