Vai al contenuto

Programmazione In C: Liste E Allocazione Dinamica


Messaggi raccomandati

Salve a tutti.

Sto studiando le liste in  C (ANSI).
In primo luogo sto trovando qualche difficoltà per cui qualcuno potrebbe consigliarmi dei manuali da leggere, pagine oppure videotutorial sull'argomento ?
 
In secondo luogo, nel programma che sto analizzando (fatto dal prof), per l'allocazione dinamica della memoria viene utilizzata l'espressione
 
struct Studente *ptr = (struct Studente*)(malloc(sizeof(struct Studente)));
 
apparte il fatto che non è stata usata la funzione typedef che aiuta molto,
qualcuno mi sa dire cosa fa quella precisa riga di codice?
 

 

Il problema nasce dal fatto che io invece di quella ho utilizzato
typedef struct Studente Stud;
Stud *ptr = malloc(sizeof(Stud));
 
Qualcuno saprebbe spiegarmi anche le differenze tra le due espressioni, se ve ne sono.
 

 

Attendo al più presto una risposta e ringrazio anticipatamente quanti mi risponderanno.

 

Link al commento
Condividi su altri siti

la differenza tra l'usare il typedef oppure no è che se non usi il typedef devi sempre e comunque specificare struct

esempio:

struct Studente { 
    int nome; 
};
void f( struct Studente argument );

al contrario mettendo il typedef definisci un nuovo tipo (il tipo Studente)... quindi puoi omettere struct.

 

Se sai qualcosa di Java, il typedef è qualcosa di simile a fare una nuova classe.

 

in definitiva è come creare un tipo stringa o boolean (che in C non esistono). ti consiglio di farti qualche ricerca per chiarirti il concetto se hai ancora dei dubbi.

tra l'altro se vedrai degli esempi di typedef boolean/string ti renderai anche conto di come viene usato struct... infatti creando boleani essendo che i valori possono essere 0 o 1 (falso, vero) si può fare qualcosa del tipo typedef enum/int... struct quindi si usa più che altro per tipi "complessi".

 

Le differenze tra le due espressioni sono minime ma sostanziali (typedef a parte):

il professore fa un cast (struct Studente*). Il che è "facoltativo" ma assolutamente consigliabile perchè la funzione malloc ritorna un puntatore a void. Questo in fase di compilazione di grossi programmi può portare a non accorgersi di un errore di cast visto che in caso si ometta il cast esplicito il compilatore non segnala errore (visto che il cast implicito da void è sempre possibile).

In pratica (per fare un esempio terra terra), facciamo conto che tu abbia:

int *v = malloc(sizeof(int));

siccome la malloc restituisce sempre *void anche se il contenuto non fosse int non riceveresti errore in fase di compilazione, ma piuttosto in fase di esecuzione (il che è da evitare).

Al contrario con un codice di questo tipo

int *v = (int*) malloc(sizeof(int));

se il cast esplicito non è un *int verrà fuori un errore già in fase di compilazione.

 

Le due funzioni però alla fin fine fanno la stessa cosa ossia allocare memoria per una struct chiamata Studente/Stud.

 

Per il libro sulle liste in C io mi sono sempre trovato molto bene con un ebook gratuito online rilasciato sotto CC:

http://blacklight.gotdns.org/guidac.pdf

Link al commento
Condividi su altri siti

Archiviato

Questa discussione è archiviata e chiusa a future risposte.

×
×
  • Crea Nuovo...