Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - malloc()
Forum - C/C++ - malloc()

Avatar
Nophiq (Founder Member)
Expert


Messaggi: 537
Iscritto: 15/11/2004

Segnala al moderatore
Postato alle 19:41
Martedì, 18/10/2005
Volevo chiedere alcune cose sulla funzione malloc:
da quello che ho capito scrivendo:

- int *p;
- p = (int*) malloc (5*sizeof(int));

faccio in modo di occupare della memoria; ma non equivale ad inizializzare un array di int di 5 valori? ovvero queste due righe di codice non si possono riassumere in:

- int array[5];


Francis Bacon: "Sapere è potere"
PM Quote
Avatar
Nophiq (Founder Member)
Expert


Messaggi: 537
Iscritto: 15/11/2004

Segnala al moderatore
Postato alle 19:46
Martedì, 18/10/2005
Vorrei commentare un programma a proposito:

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. main () {
  5.  float *v;
  6.  int n;
  7.  
  8.  printf("Inserisci la dimensione: ");
  9.  scanf("%d", &n);
  10.  
  11.  v = (float*) malloc(n*sizeof(float));
  12.  ... uso dell'array ...
  13. free(v);
  14. }



Tutto questo non si potrebbe riassumere in

Codice sorgente - presumibilmente C/C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. main () {
  5.  int n;
  6.  
  7.  printf("Inserisci la dimensione: ");
  8.  scanf("%d", &n);
  9.  
  10.  [b]float v[n];[/b]
  11.  ... uso dell'array ...
  12. }


Ultima modifica effettuata da Nophiq il 18/10/2005 alle 19:46


Francis Bacon: "Sapere è potere"
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6116
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 14:31
Mercoledì, 19/10/2005
Non puoi compilarlo il tuo esempio perch? in C la dichiarazione delle variabili va fatta all'inizio del programma. Non ? come in C++.


Seguimi su Twitter: http://www.twitter.com/pierotofy

Fai quello che ti piace, e fallo bene.
PM Quote
Avatar
Zizzius (Honoris User)
Guru


Messaggi: 675
Iscritto: 28/02/2005

Segnala al moderatore
Postato alle 17:19
Mercoledì, 19/10/2005
Esatto: come dice Piero, non ? possibile, in C, istanziare variabili se non all'inizio di un blocco. Quindi, quando un programmatore ha la necessit? di istanziare variabili di dimensioni che dipendono da condizioni dettate dalla stesso blocco, ? necessario allocare dinamicamente la memoria. Un valido esempio di questo meccanismo ? il tuo stesso programma, Nophiq: posto che si deve istanziare un vettore di lunghezza dipendente da una scelta dell'utente, si possono seguire due strade:

1) il programmatore poco avveduto (cio?, che non ha ancora studiato l'allocazione dinamica :asd: ) - o come insegnano a scuola :-| - istanzier? un vettore di lunghezza fissata arbitrariamente:
Codice sorgente - presumibilmente C/C++

  1. main()
  2. {
  3.    float v[100];
  4. }

Una cosa del genere ? stata insegnata alla mia classe giusto luned? scorso... ma questo pu? causare uno spreco della memoria eccedente da un lato, e un overflow se, viceversa, si superano il limite della dimensione del vettore (o comunque, la mancanza di spazio per eventuali ulteriori dati da memorizzare);

2) il programmatore che vuole fare le cose per bene... proceder? invece come segue:
Codice sorgente - presumibilmente C/C++

  1. main()
  2. {
  3. int n;
  4. float *v;
  5.  
  6. printf("Inserisci il numero di elementi: "); /* o simile */
  7. scanf("%d", &n);
  8.  
  9. v =(float *) calloc(n, sizeof(float)); /* trattandosi di vettori si pu? usare la funzione calloc, molto simile a malloc */
  10. }




Esiste anche un altro utilizzo dell'allocazione dinamica della memoria. Come tutti sappiamo, una funzione pu? ricevere pi? di un parametro, ma pu? restituire un solo valore: ma nel caso vi sia la necessit? di restituire un vettore, come si pu? aggirare questa regola? Con l'allocazione dinamica!
All'interno della funzione viene allocato dinamicamente un vettore (questo meccanismo ? valido ovviamente anche per le stringhe) e viene restituito il puntatore a tale vettore; vediamo un esempio:

Codice sorgente - presumibilmente C++

  1. #include <stdlib.h>
  2. #include <string.h>
  3.  
  4. /* funzione che esegue la copia di una stringa; restituisce un puntatore alla nuova stringa */
  5. char *strdup(const char *s1)
  6. {
  7.         int i=0;
  8.    char *s2 =(char *) calloc(strlen(s1), sizeof(char));
  9.  
  10.    for (i = 0; i < strlen(s1); i++)
  11.         s2[i] = s1[i];
  12.    s2[i] = '\0';
  13.  
  14.    return s2;
  15. }



Questo utilizzo dell?allocazione dinamica ? possibile in quanto il tempo di vita delle variabili istanziate dinamicamente cessa solo con la chiamata alla funzione free() e la loro visibilit? dura finch? sono puntate .

:alert: Un fattore assolutamente importante da tener presente ? il seguente: dopo un?allocazione dinamica, bisogna ricordarsi di verificare che l?allocazione abbia avuto successo, ovvero che sia stata trovata sufficiente memoria nell?heap per eseguire l?operazione di allocazione dinamica:

Codice sorgente - presumibilmente C/C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. /* ... il vettore [i]v[/i] ? stato allocato dinamicamente ... */
  5.  
  6. if (v == NULL) {
  7.    printf(?Memoria non disponibile per completare le operazioni.\n?);
  8.    exit(EXIT_FAILURE);
  9. }




Spero di aver risolto i tuoi dubbi :k: ( :ot: ma se speri di superarmi nelle Olimpiadi di Informatica, ti sbagli... :rotfl: ...scherzo! ).

Ultima modifica effettuata da Zizzius il 19/10/2005 alle 17:21
PM Quote
Avatar
Rand (Ex-Member)
Pro


Messaggi: 163
Iscritto: 17/05/2005

Segnala al moderatore
Postato alle 18:08
Mercoledì, 19/10/2005
Nophiq...

...x lo stesso effetto (ma in c++), puoi usare l'operatore "new"... x allocare dinamicamente la memoria!;)

Questo programma qua sotto (in c++) equivale a quello che hai fatto tu in c (x l'array di 5 elementi):

Codice sorgente - presumibilmente C#

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main() {
  5. int dim; //dimensione dell'array
  6. int *array; //puntatore int alla prima cella dell'array (che verr? creato in seguito)
  7.  
  8. //chiedo all'utente di che dimensione vuole l'array
  9. cout<<"Inserisci la dimensione dell'array: ";
  10. cin>>dim;
  11.  
  12. //alloco dinamicamente l'array con l'operatore new
  13. array=new int[dim]
  14.  
  15. //da qua in poi... lo puoi usare come se fosse un semplice array[dim] ...esempio...
  16. for(int i=0; i<dim; i++) {
  17.   cout<<"Inserisci l'ele num "<<i+1<<" dell'array: ";
  18.   cin>>array[i];
  19. }
  20. // e poi fai tutto il resto...
  21.  
  22. return 0;
  23. }




...lo so che forse non ti serve sapere il c++ :-| ...ma secondo me ? meglio che se stai imparando il c, lo confronti con la sua versione migliorata... il c++!! 8-|


ciaooo :k:


Ero solito portare una pallottola nel taschino, all'altezza del cuore.
Un giorno un tizio mi tirò addosso una Bibbia, ma la pallottola mi salvò la vita.

(Woody Allen)
PM Quote
Avatar
Rand (Ex-Member)
Pro


Messaggi: 163
Iscritto: 17/05/2005

Segnala al moderatore
Postato alle 18:20
Mercoledì, 19/10/2005
Testo quotato

Postato originariamente da pierotofy:

Non puoi compilarlo il tuo esempio perch? in C la dichiarazione delle variabili va fatta all'inizio del programma. Non ? come in C++.



:-| ...non sono d'accordo con Piero! ...e nemmeno con zizzius! :-|

...io il c lo faccio da una vita... e non mi ha mai dato problemi sul fatto di aver dichiarato variabili anche in mezzo a un blocco di istruzioni! 8-| ...non condivido quello che avete detto... :-|

...questo programma lo dimostra (compilato con successo su dev-c++ 4.9.9.0 x win32 con gcc 3.44)...

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.  
  3. int main() {
  4. int i=2;
  5.     printf("I vale: %d\n", i);
  6. int k=3;
  7.     printf("K vale: %d\n", k);
  8. char c='f';
  9.     printf("C vale: %c\n", c);
  10.  
  11. return 0;
  12. }



...forse il problema sta che ora i compilatori di c... accettano anche istruzioni proprie del c++ :-|

Ultima modifica effettuata da Rand il 19/10/2005 alle 18:22


Ero solito portare una pallottola nel taschino, all'altezza del cuore.
Un giorno un tizio mi tirò addosso una Bibbia, ma la pallottola mi salvò la vita.

(Woody Allen)
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6116
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 22:49
Mercoledì, 19/10/2005
Infatti ;)

Se i compilatori fanno i comodi loro senza rispettare lo standard ANSI e lasciano la possibilit? di dichiarare le variabili anche dopo un blocco di istruzioni non ? colpa di nessuno :asd:

Ultima modifica effettuata da pierotofy il 19/10/2005 alle 22:50


Seguimi su Twitter: http://www.twitter.com/pierotofy

Fai quello che ti piace, e fallo bene.
PM Quote
Avatar
Nophiq (Founder Member)
Expert


Messaggi: 537
Iscritto: 15/11/2004

Segnala al moderatore
Postato alle 22:59
Mercoledì, 19/10/2005
Testo quotato

Postato originariamente da Zizzius:
non ? possibile, in C, istanziare variabili se non all'inizio di un blocco.



Era quello che stavo cercando, il mio parere riguardo all'inizializzazione del vettore non all'inizio proviene dal Java...

Grazie :k:


Francis Bacon: "Sapere è potere"
PM Quote
Avatar
Rand (Ex-Member)
Pro


Messaggi: 163
Iscritto: 17/05/2005

Segnala al moderatore
Postato alle 15:20
Giovedì, 20/10/2005
ok Piero! :D:asd::rotfl:
...ho capito 8-|


Ero solito portare una pallottola nel taschino, all'altezza del cuore.
Un giorno un tizio mi tirò addosso una Bibbia, ma la pallottola mi salvò la vita.

(Woody Allen)
PM Quote