Problema malloc

di Anonimizzato18885 il
8 risposte
Salve a tutti non riesco a capire cosa devo inserire in questa malloc

#include<stdlib.h>
#include<stdio.h>
#include<string.h>

char* f(char *d)
{
	char *ret;
	ret=(char *)malloc(.......);
	strcpy(ret,d);
	return ret;
}

int main(int argc, char **argv)
{
	char d[9999];
	sprintf(d,"d=%d",argc);
	printf("%s",f(d));
 }

8 Risposte

  • Devi metterci strlen(d)+1
    Attenzione però a come utilizzi la funzione f(): dovresti tenere traccia del puntatore per poter poi deallocare la memoria con free().
    In C non c'è il garbage collector!
  • candaluar ha scritto:


    Devi metterci strlen(d)+1
    Attenzione però a come utilizzi la funzione f(): dovresti tenere traccia del puntatore per poter poi deallocare la memoria con free().
    In C non c'è il garbage collector!
    Grazie mille per la risposta questo non è un codice che ho fatto io ma una prova d'esame.... avevo pensato pure io allo strlen ma perchè +1? poi la traccia mi chiede questo: "Indicare un opportuno valore per la malloc in riga 6. Indicare cosa fa il programma
    e cosa viene stampato se, dopo la compilazione, viene eseguito nella seguente modalità.
    ./a.out 3 per 3"

    ma dove lo devo mette sto 3 per 3?
  • Il +1 serve per il terminatore di stringa C: es. la stringa "CIAO" è lunga 4 caratteri (strlen() ti ritorna 4 caratteri) ma per essere memorizzata ha bisogno di 5 caratteri perchè deve essere terminata, ovvero in memoria avrai i seguenti caratteri 'C' 'I' 'A' 'O' '\0'
    Per il secondo punto, cosa succede con questa chiamata ./a.out 3 per 3 ti suggerisco di studiare bene i parametri a linea di comando argc e argv, aiutandoti solo nel dirti che ./a.out è il nome dell'"eseguibile" in Linux e "3 per 3" sono gli argomenti.
  • candaluar ha scritto:


    Il +1 serve per il terminatore di stringa C: es. la stringa "CIAO" è lunga 4 caratteri (strlen() ti ritorna 4 caratteri) ma per essere memorizzata ha bisogno di 5 caratteri perchè deve essere terminata, ovvero in memoria avrai i seguenti caratteri 'C' 'I' 'A' 'O' '\0'
    Per il secondo punto, cosa succede con questa chiamata ./a.out 3 per 3 ti suggerisco di studiare bene i parametri a linea di comando argc e argv, aiutandoti solo nel dirti che ./a.out è il nome dell'"eseguibile" in Linux e "3 per 3" sono gli argomenti.
    giusto non avevo pensato al carattere terminatore grazie mille ancora
  • Quel pezzetto di codice stampa una stringa con scritto d=4. Non aggiungo altro sul codice,però sappi che non va bene.
  • loopunrolling ha scritto:


    Quel pezzetto di codice stampa una stringa con scritto d=4. Non aggiungo altro sul codice,però sappi che non va bene.
    senza i 3 mi stampa 1 comunque il codice non l'ho scritto io ma è un esercizio di una prova d'esame
  • @loopunrolling: siccome si tratta di un esercizio non ho voluto dare la risposta ma solo dare dei suggerimenti al nostro amico per trovarla.

    Comunque, per fine educativo, anche se in questo forum mi è stato già dato del pignolo , io suggerirei al professore di modificare la chiamata così
    int main(int argc, char **argv)
    {
       char d[9999];
       char *p;
       sprintf(d,"d=%d",argc);
       p = f(d);
       if( p )					// <- verifica che l'allocazione ha avuto successo
       {
          printf("%s",p);
          free(p);				// <- deallocazione
       }
     }
    e anche la funzione f() andrebbe modificata
    char* f(char *d)
    {
       char *ret;
       ret=(char *)malloc(strlen(d)+1);
       if( ret )					// <- verifica che l'allocazione ha avuto successo
           strcpy(ret,d);
       return ret;
    }
  • Output senza i tre su Linux
    
    xenon@cray-1:/media/veracrypt2/Esercizi$ ./tmp per
    d=2
    
Devi accedere o registrarti per scrivere nel forum
8 risposte