Visualizzazione dei risultati da 1 a 7 su 7

Discussione: [C]Chiarimento Malloc

  1. #1

    [C]Chiarimento Malloc

    Salve a tutti, ho creato questo codice :
    codice:
    #include <stdio.h>
    #include <malloc.h>
    
    int main(){
        int vettore[]={3,6,4,5,1,2,3,5};
        int *nuovo;
        int k=0,j,n=0 ,i;
        nuovo=(int*)malloc(sizeof(int));
        for(i=0;i<8;i++){
                         n=0;
                         for(j=0;j<i;j++){
                                          if(nuovo[j]==vettore[i]){
                                          n++;
                                          }
                         }
                         if(n==0){
                            nuovo[k]=vettore[i];
                            k++;
                         }
        }
        printf("Vettore iniziale:");
            for(i=0;i<8;i++){
              printf(" %d ",vettore[i]);
              }
        printf("\n\nVettore senza ripetizioni:");
        for(i=0;i<k;i++){
              printf(" %d ",nuovo[i]);
              }
        scanf("%d");
        return 0;
    }
    la mia domanda è: la funziona malloc non dovrebbe allocarmi solo 1 posto? perchè riesce ad allocarmeli tutti e quindi a far funzionare correttamente il programma?
    PS: altre domande, perchè se metto la funzione dentro il for allocando per ogni elemento un'altro spazio, il programma va in crash? cosa combino nella memoria?
    Grazie a tutti per eventuali risposte.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    La malloc "riserva" della memoria al tuo processo ma la memoria esiste comunque.

    Se usi della memoria riservata al tuo processo, non avrai mai problemi. In caso contrario, "potresti" non avere (apparentemente) alcun problema nell'usare memoria non riservata ma

    1) potresti "sporcare" il contenuto di variabili/array

    2) accedere a zone di memoria vietate e avere un crash.

    Solo nel secondo caso ti accorgeresti subito dell'errore ma in tutti gli altri casi potresti avere malfunzionamenti successivi (ovviamente in programmi più complessi) e non accorgertene subito.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Quindi in questo caso va anche bene? se invece l'utente decideva quanti elementi inserire era meglio usare variabile=(int*)malloc((n)*sizeof(int)) , dove n e' il numero di elementi ?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da darkhero
    Quindi in questo caso va anche bene?
    No ... non va affatto bene. Anche se funziona, non va bene.

    se invece l'utente decideva quanti elementi inserire era meglio usare variabile=(int*)malloc((n)*sizeof(int)) , dove n e' il numero di elementi ?
    E' sempre così.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    in questo caso io potrei anche non sapere quante ripetizioni ci sono, quindi come dovrei fare per allocare ogni volta che devo inserire un elemento dentro l'array? visto che il malloc dentro il for non mi va....

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    La malloc alloca un nuovo spazio di memoria. Non puoi usarlo nella for.

    Usa la realloc

    http://www.cplusplus.com/reference/cstdlib/realloc/
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    codice:
    #include <stdio.h>
    #include <malloc.h>
    
    int main(){
        int vettore[]={3,6,4,5,1,2,3,5};
        int *nuovo;
        int k=0,j,n=0 ,i;
        nuovo=(int*)malloc(1*sizeof(int));
        int dim=1;
        for(i=0;i<8;i++){
                         n=0;
                         for(j=0;j<i;j++){
                                          if(nuovo[j]==vettore[i]){
                                          n++;
                                          }
                         }
                         if(n==0){
                            nuovo=(int*)realloc(nuovo,(dim+1)*sizeof(int));
                            dim++;
                            nuovo[k]=vettore[i];
                            k++;
                         }
        }
        printf("Vettore iniziale:");
            for(i=0;i<8;i++){
              printf(" %d ",vettore[i]);
              }
        printf("\n\nVettore senza ripetizioni:");
        for(i=0;i<k;i++){
              printf(" %d ",nuovo[i]);
              }
        scanf("%d");
        return 0;
    }
    cosi' va bene?

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 © 2024 vBulletin Solutions, Inc. All rights reserved.