PDA

View Full Version : [c] allocare memoria da dentro una funzione; come si fa??


fz6
28-03-2007, 18:04
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.

andbin
28-03-2007, 18:23
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).

71104
28-03-2007, 18:29
hack: anziché ritornare sempre 0 ritorna il puntatore alla memoria allocata castato a int. ovviamente non funziona sulle macchine a 64 bit :P

fz6
28-03-2007, 18:45
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?

71104
28-03-2007, 19:35
no, puntatore a struttura: quando la funzione inizializza esce quella variabile deve puntare alla memoria allocata dalla funzione.

fz6
29-03-2007, 10:08
mi potresti fare un esempio di codice?

grazie per la pazienza..

fz6
29-03-2007, 10:27
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;
}

andbin
29-03-2007, 11:18
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.

71104
29-03-2007, 15:25
[...] 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.