Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. 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];

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
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
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++.


Il mio blog: https://piero.dev
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:

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
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
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


Il mio blog: https://piero.dev
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:

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-|

PM Quote