|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Oct 2002
Messaggi: 3925
|
[C] Utilizzo base di malloc(), sizeof() e realloc()
Salve a tutti. A dire il vero non so se avrete voglia di rispondermi, data l'inutilità della cosa ma, fino a prova contraria, domandare è lecito...
![]() Veniamo al dunque, ho scritto questo codice a scopo didattico, come introduzione alle funzioni in oggetto: Codice:
#include <stdio.h> #include <stdlib.h> #include <malloc.h> int main() { int i, cont = 0; int *array = NULL; printf("Inserisci l'elemento 0: "); scanf("%d", &i); if (i>50) array = (int *)malloc(sizeof(int)); while(i>50) { array[cont] = i; cont++; printf("Inserisci l'elemento %d: ", cont); scanf("%d", &i); if (i>50) array = (int *)realloc( array, ( sizeof(int)*(cont+1) ) ); } for (i=0; i<cont; i++) printf("Elemento %d: %d\n", i, array[i]); return(0); } ![]() PS: Se avete voglia di darmi qualche dritta su come ottimizzare il codice siete i benvenuti! ![]()
__________________
Intel Core i5 4690K by Cooler Master Hyper 412S | ASRock Z97 Extreme4 | G.Skill Ares 2x4GB DDR3 1600 | MSI nVidia GTX 260 55nm | Samsung SSD 840EVO 250GB | Cooler Master Stacker | Corsair RM650x
Ultima modifica di riva.dani : 11-03-2008 alle 20:29. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Mar 2005
Città: Morimondo city
Messaggi: 5491
|
sto imparando anchio il C ma dubbio,per usare realloc() non bisogna utilizzare prima calloc()?
__________________
Khelidan |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Oct 2002
Messaggi: 3925
|
Quote:
![]()
__________________
Intel Core i5 4690K by Cooler Master Hyper 412S | ASRock Z97 Extreme4 | G.Skill Ares 2x4GB DDR3 1600 | MSI nVidia GTX 260 55nm | Samsung SSD 840EVO 250GB | Cooler Master Stacker | Corsair RM650x
|
|
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Mar 2005
Città: Morimondo city
Messaggi: 5491
|
Quote:
![]()
__________________
Khelidan |
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2776
|
Si può fare ma è molto più comoda la realloc
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Poi in seguito, quando avrai deciso che gli elementi di una lista non devono piu' crescere, allora si potra' trasformare la lista in array, conoscendo appunto la dimensione. Se e' un esercizio a titolo di esempio va bene, ma a me non piacerebbe del tutto proprio perche' potrebbe deviare dall'utilizzo degli strumenti corretti. La Realloc puo' anche fallire se non c'e' spazio contiguo sufficiente (oggi meno critico grazie ai meccanismi di paginazione e memoria virtuale). La lista non fallisce fino a che c'e' spazio per almeno un elemento. Comunque, vuoi cercare di evitare la Realloc? Puoi fare la Realloc a mano... Malloc del nuovo, copi tutto il vecchio sul nuovo e poi liberi il vecchio. Se e' un esempio io metterei anche la free, e gestirei l'errore sia su Malloc che Realloc.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Oct 2002
Messaggi: 3925
|
Quote:
![]() In effetti nel frattempo ho inserito la free() e un controllo del tipo: Codice:
if(array == NULL)
__________________
Intel Core i5 4690K by Cooler Master Hyper 412S | ASRock Z97 Extreme4 | G.Skill Ares 2x4GB DDR3 1600 | MSI nVidia GTX 260 55nm | Samsung SSD 840EVO 250GB | Cooler Master Stacker | Corsair RM650x
|
|
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Comunque l'algoritmo per farla non e' come l'hai descritto. Sarebbe sufficiente - allocare una nuova risorsa esattamente grande quanto cio' che hai messo sulla Realloc. - Trasferire il contenuto del vecchio sul nuovo - Liberare il vecchio - Aggiornare il puntantore dell'array - Aggiungere in coda a tutto il nuovo elemento. Forse ti mancava l'aggiornamento del puntatore. Tieni come l'hai fatto.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Oct 2002
Messaggi: 3925
|
Intendi semplicemente:
Codice:
int *array1, *array2; ... array1 = array2 ![]() PS: L'esercizio partorito dalla mente del mio Prof consiste nell'ottenere quel risultato senza usare realloc(). Diciamo che ho barato usandola per avere un punto di partenza! Grazie per l'aiuto comunque! ![]()
__________________
Intel Core i5 4690K by Cooler Master Hyper 412S | ASRock Z97 Extreme4 | G.Skill Ares 2x4GB DDR3 1600 | MSI nVidia GTX 260 55nm | Samsung SSD 840EVO 250GB | Cooler Master Stacker | Corsair RM650x
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Oct 2002
Messaggi: 3925
|
Ok, è sera e sono stanco pure io... Se qualcuno può dare un'occhiata ho buttato giù velocemente questo (grazie mille gugoXX
![]() Codice:
#include <stdio.h> #include <stdlib.h> #include <malloc.h> int main() { int i = 0, cont = 0, k; int *array = NULL, *array2 = NULL; printf("Inserisci l'elemento 0: "); scanf("%d", &i); if (i>50) array = (int *)malloc(sizeof(int)); if(array == NULL) { printf("Memoria insufficiente"); exit(1); } while(i>50) { array[cont] = i; cont++; printf("Inserisci l'elemento %d: ", cont); scanf("%d", &i); if (i>50) { array2 = (int *)malloc( sizeof(int)*(cont+1) ); if(array2 == NULL || array == NULL) { printf("Memoria insufficiente"); exit(1); } for (k=0; k<cont; k++) array2[k] = array[k]; free(array); array = array2; } } for (i=0; i<cont; i++) printf("Elemento %d: %d\n", i, array[i]); free(array); return(0); } ![]()
__________________
Intel Core i5 4690K by Cooler Master Hyper 412S | ASRock Z97 Extreme4 | G.Skill Ares 2x4GB DDR3 1600 | MSI nVidia GTX 260 55nm | Samsung SSD 840EVO 250GB | Cooler Master Stacker | Corsair RM650x
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:50.