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

Discussione: [C] utilità malloc

  1. #1

    [C] utilità malloc

    Salve a tutti!
    PREMESSA: la domanda che sto per farvi sembrerà a molti-me compreso- piuttosto stupida.

    Sarà che è perché sono alle prime armi con il C, ma ancora non sono riuscito a capire l'utilità della funzione malloc.
    Mi spiego:
    per allocare memoria, la malloc ha bisogno di sapere "quanta" ne serve; glielo comunico, e lei mi restituisce un puntatore a quell'area di memoria; ma se io so "quanta" me ne serve, non posso direttamente dichiarare il numero preciso di variabili che mi occorrono?

    Ad esempio:
    -spesso e volentieri si prende in input il numero di strutture che occorrono (diciamo "n") ;
    -si dichiara un puntatore a quella struttura;
    -si assegna a quel puntatore l'indirizzo dell'area di memoria allocata :
    codice:
    ptr=malloc(n*sizeof(struct prova))
    ;
    -la si utilizza.
    Ma se io so quante strutture mi occorrono, non posso, ad esempio, dichiarare un array di n strutture?

    Grazie per l'attenzione.

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381

    Re: [C] utilità malloc

    Originariamente inviato da franzSPECIAL
    Ma se io so quante strutture mi occorrono, non posso, ad esempio, dichiarare un array di n strutture?
    Certo. Almeno finché lo stack non esplode.
    Magari poi ti accorgi che invece di 100 strutture te ne servono solo 50, sprecando le altre 50. Cambi un valore, ricompili e inizi a chiederti se non c'è un modo più furbo di avere solo il numero di strutture che si servono, senza dover ridimensionare a mano e ricompilare.

    E qui entra in gioco la malloc.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    117
    Il tutto dipende da se conosci già al momento della compilazione qual è la dimensione dell'array che ti serve. Se la conosci, puoi benissimo dichiarare staticamente l'array. Tuttavia, se non conosci a tempo di compilazione la dimensione dell'array, nel caso in cui tu volessi allocarlo staticamente dovresti scegliere un limite superiore alla dimensione che sai che non sarà mai superato e ciò, a seconda dell'applicazione, può essere molto inefficiente dal punto di vista della memoria (ammesso, tra l'altro, che tale limite superiore esista). In tali casi si preferisce quindi utilizzare la malloc in modo da poter stabilire a tempo di esecuzione che dimensione dovrà avere l'area di memoria che ti serve.

    Spero che sia chiaro.

  4. #4
    Quindi, se io mi faccio restituire dalla malloc , per essere tranquillo, un puntatore ad un'area di memoria di 100 strutture e poi ne utilizzo solo 50, non avrò occupato quelle altre 50;
    se invece inizializzo un array di 100 strutture e ne utilizzo solo 50, ho occupato inutilmente la memoria.

    Giusto?

  5. #5
    Non hai capito, malloc ti serve per allocare la memoria dinamicamente, ovvero, ottenere un area di memoria dalle dimensioni determinate a runtime invece che in fase di compliazione come negli array.

    Con i normali array la dimensione la scegli in fase di compilazione, con malloc la puoi scegliere a runtime.

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    117
    Originariamente inviato da franzSPECIAL
    Quindi, se io mi faccio restituire dalla malloc , per essere tranquillo, un puntatore ad un'area di memoria di 100 strutture e poi ne utilizzo solo 50, non avrò occupato quelle altre 50;
    se invece inizializzo un array di 100 strutture e ne utilizzo solo 50, ho occupato inutilmente la memoria.

    Giusto?
    No, ma durante l'esecuzione potresti scoprire che a te invece di 100 strutture ne servono 50, così invece di porre n=100 poni n=50 e ne allochi solo 50.

    Il tutto si basa quindi sul fatto che tu spesso non sei in grado di sapere già mentre scrivi un programma un array quanto deve essere grande.



    Supponiamo ad esempio di dover implementare un programma che prenda in input 20 numeri dati dall'utente e li ponga in ordine crescente. In questo caso, basta creare staticamente un array di 20 numeri senza utilizzare la malloc, richiedere all'utente i numeri che vuole inserire e poi applicare sull'array l'algoritmo di ordinamento. In questo caso, però, sai a priori, prima di compilare, che l'utente inserirà 20 numeri, e il programma non funzionerà se ce ne sono più o meno di 20.

    Nel caso in cui invece, per rendere più generico il programma, si voglia far si che l'utente possa inserire quanti numeri voglia, si può fare in questo modo. Si chiede preventivamente all'utente quanti numeri vuole inserire, allocare l'array con malloc della sola dimensione che serve (5, 10, 100, 1000 elementi, etc.), leggere gli elementi e applicare l'ordinamento.
    Tale programma potrebbe essere realizzato anche senza la malloc, ovvero allocando staticamente l'array, tuttavia non sapendo quanto grande fare l'array si tende a scegliere un numero sufficientemente grande (ad es, 1000) così che l'utente possa operarvi quante più volte è possibile senza che gli venga detto di aver scelto troppi elementi. Con tale scelta, però, se l'utente vuole ordinare 1001 elementi non lo può fare, e se l'utente è abituato quasi sempre ad operare con pochi elementi (tipo 5, 10, 20 elementi), ogni volta si sarebbe allocato uno spazio sproporzionato alle necessità.

    C'è comunque da dire, che anche impiegando la malloc, così come nell'allocazione statica, permangono comunque dei limiti fisici per i quali la tua memoria non può allocare più di un tot di elementi, tuttavia l'utilizzo della memoria impiegando la malloc risulta essere più efficiente.

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    codice:
    int main()
    {
        int n = 0;
        scanf("%d", &n);
    
        int array[n];
        printf("Allocati %d elementi", n);
    }
    Cos'è che dicevate sul fatto che è necessario sapere prima il numero di elementi?

    Come ha detto shodan, la differenza è che così viene arrocato nello stack, usando malloc si alloca nell'heap.

    Il che significa, soprattutto, che un array statico viene eliminato una volta terminata la funzione che l'ha allocato sullo stack, un array allocato dinamicamente con malloc è disponibile fino a che non viene liberata la memoria.
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    117
    Quando scrivi int array[n], n deve essere una costante, non può essere una variabile.

  9. #9
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Originariamente inviato da Ippo343
    Cos'è che dicevate sul fatto che è necessario sapere prima il numero di elementi?
    Non passare al lato oscuro del gcc + C99
    (Tra l'altro solo supportato dal gcc stesso a quanto ne so)
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  10. #10
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Si beh era solo per far vedere che non è una cosa impossibile, anche io lo farei ovviamente con malloc... però era per sottolineare che la differenza tra malloc e l'allocazione statica non è una questione di sapere la dimensione dell'area di memoria, ma piuttosto di *dove* è localizzata questa memoria.
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

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.