[C, Teoria] Free
Ciao a tutti!
Ho risolto, potete chiudere. Lascio l'esercizio in caso qualcuno volesse cimentarsi nella risoluzione!
Ho risolto, potete chiudere. Lascio l'esercizio in caso qualcuno volesse cimentarsi nella risoluzione!
Risposte
Ho dato una occhiata veloce al codice ma mi sembra più complicato di quanto sia necessario. In particolare, non è chiaro perché ti stia complicando la vita usando l'aritmetica dei puntatori. Per esempio:
Il primo problema con free è in effetti legato a questo tentativo di evitare di usare la notazione più semplice. Infatti abbiamo che
è un puntatore a string per cui non puoi usare il punto per accedere ai suoi elementi. Avrei dovuto semplicemente scrivere:
Mi stupisce compili. In effetti io ottengo i seguenti errori in fase di compilazione:
(*((*b) + i)).str // È equivalente a (*b)[i].str
Il primo problema con free è in effetti legato a questo tentativo di evitare di usare la notazione più semplice. Infatti abbiamo che
((*b) + i)
è un puntatore a string per cui non puoi usare il punto per accedere ai suoi elementi. Avrei dovuto semplicemente scrivere:
(*b)[i].str
Mi stupisce compili. In effetti io ottengo i seguenti errori in fase di compilazione:
gcc main.c main.c: In function 'print_n_free': main.c:78: error: request for member 'str' in something not a structure or union main.c:82: error: request for member 'str' in something not a structure or union
Ciao!
Grazie per la risposta, potete chiudere ho risolto.
P.s. ho usato l'aritmetica dei puntatori perché non l'ho mai usata granchè, così mi sono potuto esercitare come si deve!
Grazie per la risposta, potete chiudere ho risolto.
P.s. ho usato l'aritmetica dei puntatori perché non l'ho mai usata granchè, così mi sono potuto esercitare come si deve!

Ci sono situazioni in cui l'aritmetica dei puntatori è utile, ma non credo lo sia in questo caso. Riduce solo la leggibilità del codice. Ti consiglio comunque di cercare di memorizzare il valore di espressioni che usi più volte in modo da avere un singolo punto da modificare nel caso in cui ci sia un errore. Avresti insomma potuto scrivere qualcosa come:
stringa *current = (*b) + i; free(current->str); free(current);