|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Mar 2006
Messaggi: 46
|
[c] allocare memoria da dentro una funzione; come si fa??
salve, io ho queto codice, che riporto:
typedef enum { APERTO, CHIUSO } struttura_tipo; typedef struct { char *testo; struttura_tipo tipo; int numero; } struttura; int inizializza(struttura *S, char *nome) { S->tipo=APERTO; S->numero=1; S->testo=nome; return 0; } void stampa_stato(struttura *S) { if (S->tipo == APERTO) printf("APERTO"); else printf("CHIUSO"); } int main() { struttura *A=NULL; A=(struttura *)malloc(sizeof(struttura)); int i=inizializza(A,"ciao"); printf("stato: "); stampa_stato(A); printf(" numero: %d\n",A->numero); printf("testo: %s\n",A->testo); return 0; } il programma non fa altro che inizializzare un nuovo oggetto di tipo struttura. Funziona. Il mio problema è che devo (x cause legate alle specifiche dell'esercizio che devo fare) x forza allocare la memoria per l'oggetto da dentro la funzione INIZIALIZZA e non posso cambiare il prototipo di questa funzione. Come posso fare?? grazie. |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Ma se dici che non puoi cambiare prototipo ..... Potresti usare una variabile globale, se ti piace (a me no).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#3 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
hack: anziché ritornare sempre 0 ritorna il puntatore alla memoria allocata castato a int. ovviamente non funziona sulle macchine a 64 bit :P
|
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Mar 2006
Messaggi: 46
|
|
|
|
|
|
|
#5 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
no, puntatore a struttura: quando la funzione inizializza esce quella variabile deve puntare alla memoria allocata dalla funzione.
|
|
|
|
|
|
#6 |
|
Member
Iscritto dal: Mar 2006
Messaggi: 46
|
mi potresti fare un esempio di codice?
grazie per la pazienza.. |
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Mar 2006
Messaggi: 46
|
intendi così?
int inizializza(struttura *S, char *nome) { S->tipo=APERTO; S->numero=1; S->testo=nome; return 0; } void stampa_stato(struttura *S) { if (S->tipo == APERTO) printf("APERTO"); else printf("CHIUSO"); } int main() { struttura A; int i=inizializza(&A,"ciao"); printf("stato: "); stampa_stato(&A); printf(" numero: %d\n",A.numero); printf("testo: %s\n",A.testo); return 0; } |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Innanzitutto facendo così hai allocato la struttura sullo stack e non dinamicamente. Se come hai detto all'inizio, devi allocare la struttura nella funzione inizializza(), è ovvio che dichiarare la struttura nel main non è quello che avevi detto ....
Per farmi capire meglio, quello che hai appena scritto: Codice:
int inizializza(struttura *S, char *nome) {
....
}
int main() {
struttura A;
int i=inizializza(&A,"ciao");
...
}
Ma non è quello che hai detto all'inizio. Deciditi .... o fai come hai appena fatto, o allochi dinamicamente la struttura all'interno di inizializza() ma questo presuppone che tu ne cambi il prototipo.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#9 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:10.




















