View Full Version : [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.
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.La questione è che devi cambiare il prototipo. Allocare la struttura dentro la funzione inizializza() non è certo un problema. Il fatto è che ... come la restituisci??? Hai 2 modi: far ritornare un puntatore struttura* oppure ricevere come argomento un puntatore al puntatore (cioè struttura**) in modo che la funzione inizializza() possa scrivere l'indirizzo della struttura allocata nella variabile dichiarata nella funzione chiamante.
Ma se dici che non puoi cambiare prototipo ..... :boh:
Potresti usare una variabile globale, se ti piace (a me no).
hack: anziché ritornare sempre 0 ritorna il puntatore alla memoria allocata castato a int. ovviamente non funziona sulle macchine a 64 bit :P
Ma se dici che non puoi cambiare prototipo ..... :boh:
Potresti usare una variabile globale, se ti piace (a me no).
che vuol dire? creo una variabile globale di tipo struttura?
no, puntatore a struttura: quando la funzione inizializza esce quella variabile deve puntare alla memoria allocata dalla funzione.
mi potresti fare un esempio di codice?
grazie per la pazienza..
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;
}
intendi così?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:
int inizializza(struttura *S, char *nome) {
....
}
int main() {
struttura A;
int i=inizializza(&A,"ciao");
...
}è corretto. Hai dichiarato la struttura nel main, passi il puntatore alla struttura ad inizializza() che si occuperà di impostare i campi.
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.
[...] ma questo presuppone che tu ne cambi il prototipo. o che usi la variabile globale (giusto per non confondergli le idee :p). quella che hai dichiarato non è una variabile globale: è locale del main.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.