Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1
    Utente di HTML.it L'avatar di sky_451
    Registrato dal
    Apr 2003
    Messaggi
    194

    [C/C++]Dubbio sul funzionamento di malloc()

    Salve a tutti,
    nel seguente codice ho allocato un array di 27 elementi short.
    Com'è possibile che il for vada in crash solamente quando la i arriva ad essere uguale a 3728?
    Per me era più logico che il programma si bloccasse non appena la i fosse arrivata ad essere uguale ad n. Sicuramente mi sbaglio.
    Grazie per l'aiuto.

    codice:
    short *vettore;
    
    int main()
    {
         int n = 27;
         int i;
    
        vettore = (short *) malloc(sizeof(short) * n);
    
        for(){
            vettore[i] = 1;
        }
    
        return 0;
    }
    p.s. il file sorgente ha estensione .cpp e sto utilizzando visual studio 2008
    "There is no dark side of the moon really. Matter of fact it’s all dark."

  2. #2
    Quel for è completamente sbagliato.
    Primo mancano due punti-e-virgola, Secondo cicla all'infinito.
    Poi manca la free(), e vettore è globale, MALE !
    E non controlli neanche il valore di ritorno della malloc.

    Ecco la versione corretta:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
         short *vettore = NULL;
         const int n = 27;
         int i = 0;
    
        if((vettore = (short *) malloc(sizeof(short) * n)) == NULL){
    
            puts("Memory failed");
            exit(EXIT_FAILURE);
    
        }
    
        for(; i < n; i++)
            vettore[i] = 1;
    
        free(vettore);
        vettore = NULL;
    
        return 0;
    }

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Il programma va in crash quando tenta di scrivere in indirizzi non allocati al processo.

    Altrimenti, si "sporca" solamente della memoria appartenente comunque al processo, ma questo non causa un immediato crash.

    Ma in tutto cio', la malloc non c'entra ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Utente di HTML.it L'avatar di sky_451
    Registrato dal
    Apr 2003
    Messaggi
    194
    Per il for scritto male è stato un mio errore di scrittura, scusate:
    codice:
    for(i=0; i<999999; i++){
            vettore[i] = 1;
    }
    ecco io avevo provato con un for di questo tipo.
    So che l'uso di variabili globali è orribile, ma per il progetto d'esame che sto facendo va più che bene e mi ha risparmiato un po' di tempo.
    Il problema che ho nel programma originale è appunto quando vado ed eseguire la free che a runtime ritorna un'eccezione del tipo: HEAP CORRUPTION DETECTED.
    Inizialmente ho pensato che l'errore venisse causato proprio dal fatto che la malloc allocasse più memoria del dovuto. Invece, mi sembra di aver capito da quello che ha detto oregon, che in realtà la memoria da i >= n e < di un tot non sia quella allocata per il vettore, ma per l'intero processo e finchè incasino quella non c'è nessun errore.
    Allora non riesco a capire perchè la free genera l'eccezione. In più nello stesso programma eseguo la stessa identica operazione con altri vettori e quando eseguo la free tutto funziona.
    Da cosa potrebbe dipendere?
    "There is no dark side of the moon really. Matter of fact it’s all dark."

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Intanto e' diverso se hai compilato in modalita' debug (come mi pare di capire) o release.

    Nel primo caso, le normali malloc e free della libreria sono sostituite da altre funzioni, appositamente scritte per effettuare alcuni controlli (come fa la free) circa eventuali scritture in aree fuori dalla zona allocata.

    In modalita' release questi controlli non sono effettuati e gli eventuali errori di corruzione dell'heap potrebbero non essere rilevati (il comportamento e' indefinito, ovvero, casualmente potresti avere un errore oppure no ... secondo lo stato attuale dell'allocazione della memoria).
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it L'avatar di sky_451
    Registrato dal
    Apr 2003
    Messaggi
    194
    Ho risolto il problema, però non mi spiego il perchè. Nel programma orginale il vettore verso veniva inizializzato attraverso una fscanf da file:
    codice:
    fscanf(fp, "%d", &verso[i]);
    ora invece ho provato a utilizzare una variabile temporanea:
    codice:
    int temp;
    
    fscanf(fp, "%d", &temp);
    verso[i] = temp;
    in questo modo la free finale non da problemi.

    p.s. verso è sempre un array di short.
    "There is no dark side of the moon really. Matter of fact it’s all dark."

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Ma cosa c'entra questo discorso con quello iniziale (la for oltre il 27 ???) ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it L'avatar di sky_451
    Registrato dal
    Apr 2003
    Messaggi
    194
    La modalità è debug.
    "There is no dark side of the moon really. Matter of fact it’s all dark."

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Scusa, ma non ci sto capendo molto ... ti ripeto, cosa c'entra con il problema del ciclo oltre il 27 ?

    Cosa c'entra adesso la scanf?

    Dov'e' la free?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it L'avatar di sky_451
    Registrato dal
    Apr 2003
    Messaggi
    194
    Il fatto è che io all'inizio pensavo che la free non andasse a buon fine perchè mi "sembrava" di allocare malamente la memoria. Però come mi hai fatto giustamente notare, questo non c'entra assolutamente nulla.
    "There is no dark side of the moon really. Matter of fact it’s all dark."

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