[C] Funzione malloc

di il
6 risposte

[C] Funzione malloc

Buonsara a tutti,
sono di nuovo qui per chiedervi aiuto. Non riesco a capire il ruolo che svolge la funzione malloc. Di seguito il codice:

 #include <stdio.h>
 #include <stdlib.h> 
 #include <string.h>
 
int go (char *a, char *b) {
           char *temp = b;
           if (*a < 'a') {
                    *b++ = *a;
                    *a = '_';
                    }
                    a++;
                    
            if (*a == '\0') {
                  return 0;
                  }
            return count (b, temp) + go (a,b);
}

int count (char*a, char*b) {
           return a-b;
}

int main( ) {
          char word[ ] = "MinMax";
          int len = strlen(word);
          char *res = (char*) malloc (sizeof(char)*len + 1); 
          for (int i=0; i<len; i++) {
                  *(res + i) = '\0';
                  }
          int n = go (word, res);
          printf("%s %s %d\n", word, res, n);
          return 0; 
}


L'esercizio richiede: "Si disegnino lo stack dei “record di attivazione” e la memoria allocata dal programma nello heap nell’istante precedente al momento in cui la funzione g() esegue l’istruzione return 0 indicata dalla freccia. Si rappresentino tutte le variabili adottando le solite convenzioni (vettori: blocchi contigui; puntatori: frecce; valori indefiniti: punti interrogativi). Si ricorda che nella codifica ASCII dei caratteri i catteri maiuscoli corrispondono ai numeri decimali 65-90 e quelli minuscoli ai numeri decimali 97-122."

L'argomento che proprio non riesco a capire è questo discorso sulla memoria dinamica e il ruolo del malloc. Qualche buon anima che mi può aiutare?

6 Risposte

  • Re: [C] Funzione malloc

    È più facile di quello che pensi: nell'heap salta fuori il blocco di memoria allocato con malloc.
    suppongo sia un esercizio per farti comprendere "dove" vengono allocate le porzioni di memoria statiche, le variabili e gli array a runtime
  • Re: [C] Funzione malloc

    Ti posto la soluzione. L'unica cosa che ho capito è che malloc in questo caso fa puntare al puntatore res 7 blocchi consecutivi di memoria. Il resto è arabo. Purtroppo ho solo delle slide che mi spiegano l'argomento della memoria dinamica e su internet ho trovato argomenti un pò caotici. Per fare quel tipo di disegno li non saprei da dove cominciare.

  • Re: [C] Funzione malloc

    Forse perchè è un disegno non proprio così utile.
    Comunque ti metto sulla buona strada
    char word[ ] = "MinMax";
    Cosa accadrà? Da "qualche parte" "qualcuno" dovrà memorizzare 6 caratteri (ma sono 6 o 7? poniti la domanda)
    int len = strlen(word);
    In questo passo stai dichiarando, ex novo, una variabile. Dove sarà messa?
    Per inciso: come funziona strlen ?
              char *res = (char*) malloc (sizeof(char)*len + 1); 
    In questa "roba" banalmente allochi len+1 carattere sullo heap.
  • Re: [C] Funzione malloc

    Allora i caratteri sono 7 in realtà poiché necessitiamo anche di uno spazio per '\0'. Poi, len assume il valore 6, poiché calcola i caratteri contenuti nella stringa "MinMax", senza calcolare '\0'. Ma cos'è sto benedetto heap?
  • Re: [C] Funzione malloc

    Se ricordo bene le mie letture dei tempi del System 7 di Apple, lo heap è uno spazio di memoria delimitato e, in un certo senso, "riservato" agli scopi di una applicazione/programma (che può disporne come meglio crede). Ai tempi di System 7 lo heap aveva una dimensione fissa determinata al momento del lancio del programma, strettamente legata a un'area "fisica" della ram. In Windows, attualmente, mi pare che sia qualcosa più di "virtuale" che di fisico, per via del meccanismo di paging che ne offre un accesso "indiretto" tramite indirizzi, per così dire, "mediati".

    Tutta roba che affermo aspettando d'essere smentito, perché non è che lo sappia, piuttosto lo intuisco in conseguenza del poco che so.
  • Re: [C] Funzione malloc

    tommireds ha scritto:


    Ma cos'è sto benedetto heap?
    aiiiii... andiamo proprio male, nel senso che dovrai approfondire parecchio l'argomento.
    in due parole (troverai mille spiegazioni più approfondite) un programma funziona con due aree di memoria (... oddio... se qualche mio collega legge mi ritirano la laurea per dargli fuoco ).

    Una si chiama stack, e viene normalmente "manipolata" dalle funzioni. Le variabili che definisci nelle funzioni vengono materialmente allocate lì, sullo stack (insieme ai parametri delle funzioni stesse)

    Dentro lo stack, ad ogni chiamata di funzione, viene "impilato" un "pacchettone" che comprende le variabili locali, i parametri (e tante altre belle cose).
    Quando una funzione termina, il "pacchettone" viene buttato via, liberando la memoria occupata dallo stack.
    Esso, pertanto, aumenta e diminuisce dinamicamente man mano che le varie funzioni vengono chiamate e "lavorano".

    Avendo questa particolarità, di essere creato e distrutto, i dati presenti lì sopra sono però volatili, nel senso che il risultato delle computazioni "sparisce" ogni volta.

    Qualora volessi mantenere delle informazioni di tipo "statico" (non far confusione con lo static del C), cioè che sono "immortali", allora dovrai allocarle da un'altra parte.

    Dove? Sullo heap.
    Cos'è? un'area di memoria dove il programma esplicitamente si "ritaglia" pezzi di memoria, per mantenere informazioni che vanno serbate e non distrutte ogni volta.

    Come ci si ritaglia un pezzo di heap? Ad esempio con malloc() (e le varie funzioni cugine).

    Dirò quindi "caro sistema operativo, a me serve un pezzo di memoria diciamo da 1000 byte, per farci quello che mi pare e piace".

    Il programma farà una malloc di 1000 byte, e se va tutto bene "qualcuno" (non chiariamo chi) dirà:
    caro programma, iniziando dalla locazione di memoria 3734263623 ci sono i tuoi 1000 byte. fanne buon uso.

    per inciso, dal momento che questa memoria è "highlander", cioè "immortale", dovrà essere IL TUO programma a dire, prima o poi
    grazie, non mi serve più il blocco di memoria che parte da 3734263623 per i successivi 1000 byte
Devi accedere o registrarti per scrivere nel forum
6 risposte