Aiuto malloc e analisi codice

di il
12 risposte

Aiuto malloc e analisi codice

Ciao a tutti. Sto studiando da poco il linguaggio C e mi sono imbattuto nelle malloc che proprio non riesco a capire, soprattutto la correlazione che c'è tra malloc e puntatori. Chi me le può spiegare in parole semplici? Ho cercato su diversi siti ma proprio non riesco a capirle!
Inoltre sto facendo degli esercizi piuttosto "avanzati", almeno per il mio livello e ce ne sono alcuni che non riesco a fare tra cui questo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* r(char *s)
{
int l=strlen(s);
int i;
char* rr=(char*)malloc(sizeof(char)*l+1);
for (i=0;i<l;i++)
rr[i]=s[l-i-1];
rr[i]='\0';
return rr;
}
char* g(char* s1)
{
int i;
char* s=(char*)malloc(sizeof(char)*strlen(s1)+1);
*s='\0';
strcat(s,s1);
for (i=0;s[i]=='0';i++)
s[i]='9';
s[i]--;
if(s[i]=='0' && s[i+1]=='\0')
s[i]='\0';
return s;
}
int main(int argc,char** argv)
{
char* a[5]={"321","1000","1","99","69"};
int i;
for (i=0;i<4;i++)
printf ("%s\n",r(g(r(a[i]))));
}
chi me lo può spiegare passo per passo?
vi ringrazio in anticipo
Ciao

12 Risposte

  • Re: Aiuto malloc e analisi codice

    Malloc chiede al sistema un pò di spazio e se il sistema glielo concede al programma fa tornare la prima posizione valida dove si trova lo spazio richiesto. la posizione viene espressa come void * cioè puntatore ad una cella generica. Faccendo il cast del caso lo rendiamo compatibile con la richiesta.
    
    char* rr=(char*)malloc(sizeof(char)*l+1);
    
    char * rr //puntatore a char ancora vuoto
    
    malloc(sizeof(char)*l+1) trovami dello spazio libero di dimensione sizeof(char) + lunghezza stringa + 1 carattere per il fine stringa '\0';
    
    (char*)malloc(sizeof(char)*l+1);
    cast dello spazio trovato da void* a char *
    
    char* rr=(char*)malloc(sizeof(char)*l+1); 
    assegnazione dello spazio al puntatore rr che adesso punta alla prima locazione di memoria ritornata da malloc.
    
    maggiori informazioni:
    http://it.wikipedia.org/wiki/Mallo
  • Re: Aiuto malloc e analisi codice

    Grazie mille per la risposta ma tuttavia non riesco ancora a capire a cosa possa servire... Scusa ma a cosa serve assegnare spazio? Nei programmi precedenti non ne ho mai avuto bisogno di farlo... BO! E cosa c'entra la malloc con il puntatore? E cosa vuol dire fa tornare la prima posizione valida dove si trova lo spazio richiesto?
    Grazie mille per la risposta/e
  • Re: Aiuto malloc e analisi codice

    Sai cos'è un puntatore? è una variabile che non tiene dati ma l'indirizzo di dove si trova un dato. Assegnare spazio serve nel caso in cui tu vuoi copiare una variabile (tuo caso una stringa) ma non sai quanto è lunga (cioè quanto spazio in memoria questa ne tiene). se non vuoi usare malloc (memory allocation - allocazione memoria) allora devi prevedere un vettore di char molto lungo così non hai problemi a copiare una stringa in un altra. Il problema è quanto sarà lungo sto vettore? chi lo sa.
    esempio:
    stringa iniziale: s = "321"
    lunghezza stringa = 3

    tu crei un vettore di char cosi
    char rr[10];
    così sei sicuro che la stringa s ci stà nella stringa rr.
    se poi dopo la stringa s diventa: s = "1234567899024534645746756"
    con lunghezza = 25
    ecco che il tuo char rr[10] non la può contenere.

    quindi malloc serve per allocare dello spazio (chiedere al sistema un pò di memoria) tanta quanto mi serve ne di + ne di -, per contenere la stringa s.

    Meglio non so spiegartelo.

    malloc ritorna un puntatore ad una memoria, non capisco la tua domanda che centra malloc con un puntatore. Siccome i disegnini non li so fare pensala in questo modo.
    Hai dei mattoni tutti messi in riga diciamo 100. vuoi dipingere di rosso da 10 al 15. malloc ti dice la posizione dov'è il 10 per darti la possibilità di iniziare nel posto giusto.Te lo semplificata un casino di + non so. Tu vai col tuo pennello (char *rr) e punti al 10-imo mattone e inizi a dipingere.
  • Re: Aiuto malloc e analisi codice

    Ok ora diciamo che ho capito meglio cosa è! grazie mille per la spiegazione! per quanto riguarda il codice che ho incollato potresti spiegarmelo passo per passo fino ai risultati? in questo modo riesco a capirlo...
  • Re: Aiuto malloc e analisi codice

    Perchè nella funzione main tra parentesi ci sono due variabili? e cosa vogliono dire i due asterischi?
    aiutooo
  • Re: Aiuto malloc e analisi codice

    Int main(int argc, char **argv)

    argc è il numero dei parametri passato al programma compreso il nome del programma.
    argv è una matrice contenente tutte le variabili passati al programma.

    se questo programma si chiamasse prova.exe e tu dalla riga di commando (cmd di windows) chiamassi sto proramma così:
    
    C:\>prova.exe arg1 arg2 arg3
    
    argc sarebbe = 4
    argv = {"prova.exe","arg1","arg2,"arg3"};
  • Re: Aiuto malloc e analisi codice

    Ok quindi in questo caso ai fini dell'output su schermo non serve a niente. giusto?
  • Re: Aiuto malloc e analisi codice

    In questo codice:
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    char* r(char *s);
    char* f(char* s1)
    {
    int i;
    char* s=(char*)malloc(sizeof(char)*strlen(s1)+2);
    *s='\0';
    strcat(s,s1);
    for (i=0;s[i]=='9';i++)
    s[i]='0';
    if (s[i]!='\0')
    s[i]++;
    else
    strcat(s+i,"1");
    return s;
    }
    char* g(char* s1);
    char* k(char *s1, char* s2)
    {
    char *i;
    char *j=strdup(s1);
    for (i=strdup(s2);*i!='\0';i=g(i))
    j=f(j);
    return j;
    }
    int main(int argc,char** argv)
    {
    char* a[4]={"10","52","99","1000"};
    char* b[4]={"59","23","1000","99"};
    int i;
    for (i=0;i<4;i++)
    printf ("%s\n",r(k(r(a[i]),r(b[i]))));
    }
    ho difficoltà a capire cosa fa la funzione k... ho capito che passa come parametri r(a) e r(b) e fin qui ci siamo... *j=0101 perchè il primo elemento di a è 10 e la funzione r che è la stessa del primo codice che ho postato non fa altro che rovesciare la stringa... Il problema è il for che dice:
    i=strdup(s2) in questo caso raddoppia 95(che era il 59 originale della stringa b)... ok ma cosa vuol dire che i=9595? la condizione che dice che *i deve essere diverso da '\0' non sarà mai verificata e si prosegue all'infinito! 9595 non sarà mai uguale a '\0' anche con la funzione g che lo modifica!
  • Re: Aiuto malloc e analisi codice

    Scusa ma che senso ha eseguire queste funzioni tra latro fatte molto male perche c'è allocazione memoria all'infinito ma non c'è un free da nessuna parte. E' un esercizio su come mandare in crash il sistema operativo oppure il programma stesso? Non riesco a capire. strdup di torna una copia della stringa e se non c'è la fa a farti tornare la copia titorna null. se torna null *i non esiste perche sarebbe i[0] nella posizione 0 della memoria e il programma andrebbe in crash. Non so cosa faccia g(i) ma queste funzioni non sono adatte allo studio del linguaggio della programmazione. E' un modo di programmare molto brutto e non so dove stai studiando perche nessun programmatore scriverebbe codice in quel modo.
  • Re: Aiuto malloc e analisi codice

    Questa è una prova di esame fatta l'anno scorso al politecnico - ing informatica. Sarà pure scritta male ma devo trovare l'output. Quella che devo fare sett prossima è simile quindi devo capire cosa genera... Mi sembra strano che tu non riesca a farla. Allora non sei poi così esperto!
  • Re: Aiuto malloc e analisi codice

    Infatti non sono poi così esperto perche non mi metto a studiare codice fatto a muzzo. Io quando non capisco una operazione mi metto li e apro il debugger oppure con carta e penna mi scrivo tutti i passaggi. Sapere cosa genera è facilissimo basta metterlo sotto il compilatore e guardare l'output.
    Ma non ho voglia di aprire il compilatore per te, o di mettermi li con carta e penna a studiare un codice fatto MALISSIMO.Poi non ho mai detto che sono esperto e se questa impressione che ti ho lasciato intendere mi dispiace ma non è così. Io trovo i bug ogni giorno per lavoro caro mio e in questo codice ho visto solo bug. Se fossi un professore non guarderei neanche una riga di quel codice e la valutazione sara un bel 2 solo per l'impegno di scrivere qualcosa su un editor. Quindi auguri per il tuo esame che questo sarà il mio ultimo post in questo thread. Se vuoi sapere l'output apri quel maledetto debugger e controlla ad ogni passaggio cosa succede coi variabili. Non è questione chi riesce a farla ma la questione è chi ha voglia di farla ed io sinceramente no perche non è compito mio. Aiutare si ma farti una relazione su codice non fatto da me no. Quindi basta con le provocazioni.
  • Re: Aiuto malloc e analisi codice

    Be' mi disp che l'hai presa così male ma non volevo provocasti cercavo aiuto solo x quella parte del codice. Se il codice fa schifo è colpa del mio professore, non mia. All'esame mica posso dirgli che il codice fa cagare e lasciare il foglio in bianco solo per questo. Cosa ci posso fare io? Vabbè
Devi accedere o registrarti per scrivere nel forum
12 risposte