Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2013
    Messaggi
    32

    [C] dubbi differenza malloc e realloc

    Qualcuno potrebbe spiegarmi l'istruzione dove ho messo i punti di domanda? Se while (val ?= -1) mi permette di bloccare il ciclo digitando -1, allora non capisco a cosa serve l'istruzione v[size-1]=val. Modificando in entrambe le istruzioni -1 con -2 ,il ciclo non dovrebbe avere lo stesso output ma bloccarsi con -2? Infine non mi è' chiara la differenza tra mallocdebug e realloc.. nel mio libro di testo e' stato dato come esercizio chiarificatore sulla malloc la " costruzione "di una qualsiasi matrice dinamica. L'esercizio l'ho svolto e funziona perfettamente ma a questo punto non capisco il motivo per cui in questo esempio non poteva essere usata l'istruzione malloc per allocare la variabile sizeof. Per sizeof infatti , tanto quando oer una matrice dinamica , variabile dim , io non so a priori lo spazio che sarà necessaria allocare.. Grazie mille a tutti coloro che avranno la pazienza di rispondere alle mie domande

    codice:
     #include <stdio.h> 
    #include <stdlib.h>  
    int main()  {      
     int *v=NULL ;        
    int i, val;       
     int size = 0;   
    do  {             
    printf ( "Inserire un nuovo elemento nell'array :");   
    scanf ("%d", &val);             
    v = (int*) realloc( v, (++size)*(sizeof(int)) );            
     v[size-1] = val; // ?????????????????????       
    } while (val != -1);   
     printf( "Elementi nell'array:");         
    for ( i=0; i < size; i++ )             
    printf ("%d ", v[i]);  
    free(v); 
    return 0; }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non ho capito bene la domanda ...

    size-1 è un indice dell'elemento del vettore che deve essere valorizzato, mentre il -1 nel while è il valore di controllo per il ciclo.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2013
    Messaggi
    32
    I primi problemi che avevo riguardavano proprio l'indice size-1 perché non avevo proprio capito che rappresentasse l'ultima cifra dell'array quindi , per come volevo fare io, per terminare con -2 ftp dovevo solo modificare il ciclo while

    L'altra domanda riguarda l'utilizzo di malloc e realloc .. Non ho chiara la differenza e non capisco perché in questo esercizio non avrei potuto usare malloc ..? Per cercare di capire meglio l'utilizzo di realloc ho fatto un altro esercizio, con output uguale a quello precedente ma ho capito ancora meno

    codice:
    #include <stdio.h>
     #include <stdlib.h> 
     int main () {   
    int val,i; 
      int size=0;   
    int * v = NULL;   
    int * more_numbers;  
      do {    
      printf (" digita un numero intero  (0 per terminare: ");     
     scanf ("%d", &val);    
      size++;     
      more_numbers = (int*) realloc (v, size * sizeof(int));    
       if (more_numbers!=NULL) {       
     v=more_numbers;        
    v[size-1]=val;      }     
     else {        
    free (v);        
    puts ("Errore (ri)allocazione della memoria");       
     exit (1);      }   }
     while (val!=0);    
    printf ("Numeri digitati: ");   
    for (i=0;i<size;i++) 
    printf ("%d ",v[i]);   
    free (v);    
    return 0; }

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da Enna90
    I primi problemi che avevo riguardavano proprio l'indice size-1 perché non avevo proprio capito che rappresentasse l'ultima cifra dell'array quindi , per come volevo fare io, per terminare con -2 ftp dovevo solo modificare il ciclo while
    Ok ... rinuncio perché non ti capisco ...

    L'altra domanda riguarda l'utilizzo di malloc e realloc .. Non ho chiara la differenza
    La differenza tra due funzioni si studia nella documentazione

    Per la malloc

    http://www.cplusplus.com/reference/cstdlib/malloc/
    (serve ad allocare memoria)

    per la realloc

    http://www.cplusplus.com/reference/cstdlib/realloc/
    (serve a cambiare la dimensione di un blocco di memoria allocata in precedenza)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Non ho provato il codice e non so se ho capito bene ciò che non comprendi.
    Guardando questo codice
    codice:
    #include <stdio.h> 
    #include <stdlib.h>  
    int main()  {      
     int *v=NULL ;        
    int i, val;       
     int size = 0;   
    do  {             
    printf ( "Inserire un nuovo elemento nell'array :");   
    scanf ("%d", &val);             
    v = (int*) realloc( v, (++size)*(sizeof(int)) );            
     v[size-1] = val;
    } while (val != -1);   
     printf( "Elementi nell'array:");         
    for ( i=0; i < size; i++ )             
    printf ("%d ", v[i]);  
    free(v); 
    return 0; 
    }
    Ti accorgi che inizialmente il valore di size è pari ad uno (riga 6) ed in seguito assume il valore 1 (riga 10) e reallochi un vettore con un solo elemento (se hai preso questo esercizio svolto dal libro di testo, io personalmente gli darei fuoco). L'unico indice che puoi utilizzare nel tuo vettore è (giustamente -.-) lo 0, che corrisponde a size-1.
    Se cambi size-1 con size-2 giustamente non ti compila (l'indice corrispondente sarebbe -1). per quanto riguarda la condizione del while puoi mettere qualsiasi valore vuoi.
    Come detto da oregon:
    size-1 è un indice dell'elemento del vettore che deve essere valorizzato, mentre il -1 nel while è il valore di controllo per il ciclo.
    la variabile val non c'entra niente con gli indici del vettore è solamente il valore che andrai ad attribuire ad un elemento dell'array.
    Spero di essere stato chiaro.
    --

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.