Modificare valore puntatore a char (char *var)

di il
3 risposte

Modificare valore puntatore a char (char *var)

Salve a tutti,

ho creato una funzione che serializza una struct ed è fatta così:
void serialize(msg_t mess, char *serialized, int *size)
{
    int sLen = 0;
    int tLen = 0;
    int iLen = 0;
    int bLen = 0;

    sLen = strlen(mess.msg);			//Dimensione della stringa
    tLen = sizeof(int) + sLen;			//Dimensione della struttura
    iLen = sizeof(int) + sLen;			//Dimensione del'informazione = | id | length(msg) | msg |
    bLen = sizeof(int) + iLen;			//Dimensione del buffer = | buf_dim | id | length(msg) | msg |
    *size = bLen;
    serialized = malloc(sizeof(char) * (bLen));	//Creo il buffer

        /* Inserisco i dati in serialized */
}
dove:
msg_t mess
è la mia struct
char *serialized
è il mio buffer dove dovrò inserire la struct serializzata per restituirla al chiamante
ìnt *size
è una variabile che serve a restituire al chiamante la dimensione del buffer (Mi server per inviare tramite socket l'informazione)

Il problema è che quando stampo il valore di serialized (che è un puntatore) nella funzione mi viene restituito, mentre quando lo provo a stampare nel main il valore è 0, mentre size viene ritornato correttamente.

La chiamata dal main è la seguente:
int main()
{
    char *buff;
    int *size;
    msg_t mess = {5, "ciao"};

    serialize(mess,buff,size);

    printf("Size: %d",*size);     //Restituisce il valore corretto
    printf("Add Buff: %d",buff) //Restituisce 0
}
Cos'è che sto sbagliando?

3 Risposte

  • Re: Modificare valore puntatore a char (char *var)

    Se allochi serialized all'interno della funzione e vuoi restituire tale valore, devi passare un puntatore a puntatore
    void serialize(msg_t mess, char **serialized, int *size)
    {
    //...
        *serialized = malloc(sizeof(char) * (bLen));   //Creo il buffer
    
    e dal main
    int main()
    {
        char *buff;
        int *size;
        msg_t mess = {5, "ciao"};
    
        serialize(mess,&buff,size);
    
        printf("Size: %d",*size);     //Restituisce il valore corretto
        printf("Add Buff: %d",buff) //Restituisce 0
    
        free( buff ); // NON DIMENTICARE!
    }
    Secondo me, comunque, siccome poi devi spedire queste stringhe tramite un canale di comunicazione per il quale suppongo ti sia dato una dimensione massima del pacchetto (che può essere comunque la dimensione della struttura a cui aggiungi i separatori di campo), ti conviene passare un buffer preallocato alla funzione serialize(), senza scomodare la malloc!
    void serialize(msg_t mess, char *serialized, int *size)
    {
    }
    int main()
    {
        char tx_buffer[80];
        int *size;
        msg_t mess = {5, "ciao"};
    
        serialize(mess,tx_buffer,&size);
    }
    Infine un'annotazione: se passi una struttura ad una funzione, passala tramite puntatore
    void serialize(msg_t *mess, char *serialized, int *size)
  • Re: Modificare valore puntatore a char (char *var)

    Capito grazie

    Comunque visto che non ho una dimensione massima del pacchetto devo fare così e non dovendo modificare la struttura non mi serve passarla come puntatore (Cosa che invece farà nella deserialize)
  • Re: Modificare valore puntatore a char (char *var)

    Comunque visto che non ho una dimensione massima del pacchetto
    Però data la struttura puoi dire fin da subito qual è la massima stringa che puoi ottenere (contando anche i separatori di campo): il campo stringa ha una dimensione massima e i campi interi anche loro, trasformati come stringhe, hanno una dimensione massima.
    non dovendo modificare la struttura non mi serve passarla come puntatore
    D'accordo, ma passare le strutture tramite puntatore è una prassi comune, anche se non devi modificare la struttura: questo principalmente per non occupare troppo spazio sullo stack (con il rischio di stack overflow) e per essere più veloci (e quindi non dover fare una "memcpy" dalla memoria allo stack ad ogni chiamata).
Devi accedere o registrarti per scrivere nel forum
3 risposte