Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [C] curiosità allocazione di memoria

    ciao a tutti
    il seguente codice

    char * comprimi(char * nome_source)
    {

    FILE * source;
    FILE *dest;
    char nome_dest[100];


    strcpy(nome_dest,nome_source);
    strcat(nome_dest,".cmp");

    source=fopen(nome_source,"r");
    dest=fopen(nome_dest,"w");

    SET_BINARY_MODE(source);
    SET_BINARY_MODE(dest);

    def(source, dest, Z_DEFAULT_COMPRESSION);

    fclose(source);
    fclose(dest);

    return nome_dest;

    }

    mi restituisce il seguente messaggio di warning:
    "returning address of local variable or temporary"
    perkè in pratica la variabile nome_dest è definita all'interno della funzione

    dovrei definire un
    char * nome_dest
    e poi magari allocare memoria per questa variabile con una malloc.

    Ora vorrei sapere
    free(nome_dest) dove va richiamata se utilizzassi il malloc?
    come dovrei fare per ottenere correttamente un char * in uscita?
    Grazie a tutti

    di certo non all'interno della funzione

  2. #2
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,591
    Il problema del codice che hai postato è che un array è in realtà un puntatore al primo elemento della lista "omogenea" che hai appena creato.

    Per questo motivo, anche se fai
    codice:
    return nome_dest;
    Stai ritornando un riferimento all'array (essendo quest'ultimo un puntatore).
    Il compilatore però elimina comunque quest'ultimo alla fine della funzione e dunque dice "Guarda che stai passando un riferimento a un valore temporaneo"

    La soluzione, come hai detto tu, è di dichiarare l'array come un puntatore, allocarlo, e restituire il puntatore. Potrai poi usare free al di fuori della funzione, tanto il puntatore punta sempre li!
    Pratico esempio

    codice:
    char * comprimi(char * nome_source)
    {
    
    FILE * source;
    FILE *dest;
    char *nome_dest;
    
    nome_dest = malloc(100*sizeof(char));
    
    
    strcpy(nome_dest,nome_source);
    strcat(nome_dest,".cmp");
    
    source=fopen(nome_source,"r");
    dest=fopen(nome_dest,"w");
    
    SET_BINARY_MODE(source);
    SET_BINARY_MODE(dest);
    
    def(source, dest, Z_DEFAULT_COMPRESSION);
    
    fclose(source);
    fclose(dest);
    
    return nome_dest;
    
    }
    
    int main() 
    {
    char *prova = comprimi("Peppe");
    //Cose tue
    
    free(prova);
    return 0;
    }
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  3. #3
    grazie mille sei stato molto gentile,
    Questo forum diventa di giorno in giorno sempre più utile

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 © 2020 vBulletin Solutions, Inc. All rights reserved.