Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15

Discussione: [C]Problema uso malloc

  1. #1
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219

    [C]Problema uso malloc

    Salve,non riesco a capire bene come funziona il comando malloc.
    Ho gia' cercato molto su internet ma non capisco perche' se scrivo ad esempio:
    codice:
    main()
    {
        short *p;
        p=(short*)malloc(8);
        printf("%d",sizeof(*p));
    }
    Comunque p punta sempre a un' area di memoria di 2 byte,che e' la capacita' di uno short,anche se gli dico di allocare 100 bytes me ne alloca sempre 2.
    Come devo fare per decidere quanta memoria allocare?

  2. #2

    Re: [C]Problema uso malloc

    Originariamente inviato da ramy89
    Salve,non riesco a capire bene come funziona il comando malloc.
    Ho gia' cercato molto su internet ma non capisco perche' se scrivo ad esempio:
    codice:
    main()
    {
        short *p;
        p=(short*)malloc(8);
        printf("%d",sizeof(*p));
    }
    Comunque p punta sempre a un' area di memoria di 2 byte,che e' la capacita' di uno short,anche se gli dico di allocare 100 bytes me ne alloca sempre 2.
    Come devo fare per decidere quanta memoria allocare?
    codice:
    main()
    {
        short *p;
        p=(short*)malloc(8*sizeof(char));
    }
    Studiati la funzione e i suoi simili, qua trovi qualcosa:
    http://www.cplusplus.com/reference/c...stdlib/malloc/
    http://www.science.unitn.it/~fiorell...guidac062.html


    Ciao

  3. #3

    Re: Re: [C]Problema uso malloc

    Originariamente inviato da MdE2005
    codice:
    main()
    {
        short *p;
        p=(short*)malloc(8*sizeof(char));
    }
    semmai 8*sizeof(short) se vuoi allocare un array di 8 short...
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4

    Re: Re: Re: [C]Problema uso malloc

    Originariamente inviato da MItaly
    semmai 8*sizeof(short) se vuoi allocare un array di 8 short...
    Si certo mi sono confuso a scrivere..


    Ciao

  5. #5
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Ok,grazie.
    Vi faccio un' ultima domanda:
    Le variabili allocate dinamicamente vengono scritto sullo heap,se alla fine del programma non libero la memoria con ad esempio:
    codice:
    free(p);
    La memoria allocata rimane sullo heap anche alla fine del programma?
    Se non ci rimane,allora c cosa serve il comando free?

  6. #6
    Originariamente inviato da ramy89
    Ok,grazie.
    Vi faccio un' ultima domanda:
    Le variabili allocate dinamicamente vengono scritto sullo heap,se alla fine del programma non libero la memoria con ad esempio:
    codice:
    free(p);
    La memoria allocata rimane sullo heap anche alla fine del programma?
    Se non ci rimane,allora c cosa serve il comando free?
    Se non usi tale comando, la memoria heap sarà allocata fino alla fine del programma: capisci bene che in base al tipo di applicazione che si sviluppa e alle risorse di cui si dispone la mancata liberazione di memoria può essere dannosa.

  7. #7
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Ho provato a creare una piccola funzione che alloca memoria prendendo in ingresso un puntatore a char,da quello che ho capito la memoria allocata non rimane fino alla fine della funzione (giusto?),il mio scopo è avere una funzione che ti restituisce il puntatore al primo elemento dell' array di char creato (ricevuto da standard input) e allocato all' interno della funzione,in modo da avere una stringa variabile,nel senso che non so le dimensioni da prima.
    Non va se la inserisco all' interno del main,ecco qua cosa ho scritto:
    codice:
    main()
    {
        char *p;
        allocam(p);     /*Non viene allocato*/
    }
    void allocam(char*p)
    {
        int lenght,k,i=0;
        char *c,ci;
        c=(char*)malloc(sizeof(char));
        while(ci!=10)
        {
          ci=getchar();
          c[i]=ci;
          i++;
          c=(char*)realloc(c,sizeof(char)*i);
        }
        p=c;
    }
    Come dovrei fare?

  8. #8
    Al di là dell'esempio è fondamentale fare delle precisazioni, ovvero parlare di 2 differenze tra lo STACK e l'HEAP; è ovvio che se ne potrebbe parlare per ore, tuttavia ritengo che, a questo livello, possa bastare.

    Queste differenze riguardano:

    1. ciò che viene allocato
    2. ciclo di vita di ciò che viene allocato


    HEAP: vi si alloca tutto ciò che è allocato dinamicamente (es. malloc e derivati, new), tale area è allocata/rimossa solo su richiesta del programma, non automaticamente; il ciclo di vita coincide con la durata del programma, salvo deallocazione dinamica tramite free, delete (a patto che sia ancora possibile ciò).

    STACK: vi si allocano le variabili locali non static e le variabili contenenti gli argomenti di una determinata funzione; il tempo di vita è correlato alla funzione nel senso che quando la funzione termina, l'area di stack allocata viene rimossa.

    Le variabili locali static hanno allocazione compilatore-dipendente.


    Spero che ora sia più chiaro.


    Ciao

  9. #9
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Grazie MdE
    Allora l' ho rifatta cosi':
    codice:
    main()
    {
        char *p;
        p=allocam(p);
        for(;*p!=10;p++)
          printf("%c",*p);
    }
    char* allocam(char*p)
    {
        int i=0;
        char *c,ci;
        c=(char*)malloc(sizeof(char));
        while(ci!=10)
        {
          ci=getchar();
          c[i]=ci;
          i++;
          c=(char*)realloc(c,sizeof(char)*i);
        }
        return c;
    }
    Giusto per vedere come funziona la malloc.La main ristampa una stringa ricevuta in input.

  10. #10
    Perfetto, sebbene manchi la deallocazione dinamica del tuo puntatore, nella fattispecie ciò è ininfluente dal momento che il programma termina, però abituati a farlo.


    Ciao

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.