C pratica di programmazione, passando un puntatore a una funzione [chiusa]

6

Considera la seguente funzione C che accetta come argomento una stringa, che viene quindi memorizzata all'interno di una struct:

struct mystruct* usestring(char* string)
{
    struct mystruct *struct;
    struct = malloc(sizeof(struct mystruct));
    struct->string = string;
    return struct;
}

La mia comprensione è che la stringa passata alla funzione è la stessa stringa memorizzata all'interno della struttura.

Qual è l'etichetta corretta in questa situazione? Dovrei fare una copia della stringa e archiviarla nella struct, o dovrei aspettarmi che la funzione caller non modifichi la stringa in seguito?

    
posta user2590835 07.08.2014 - 15:53
fonte

2 risposte

10

Questo dipenderà sempre da molti fattori, ma come guida elementare:

  1. Per i puntatori a const , la proprietà dovrebbe non essere trasferita e il callee non dovrebbe assumere che l'oggetto puntato continuerà ad esistere dopo il suo ritorno.

  2. Per i puntatori a non - const , il trasferimento della proprietà deve essere documentato . Se la proprietà è trasferita o meno è una questione di ciò che è più pratico in un determinato luogo.

  3. I puntatori dovrebbero essere a const quando possibile.

Questa non è sempre la cosa più efficiente da fare (a volte copi quando l'oggetto continuerà a esistere), ma è un modo per ridurre il numero di luoghi in cui devi stare attento.

    
risposta data 07.08.2014 - 16:16
fonte
2

Come altri hanno già detto, dipende dal contesto.

Considera il seguente codice, che crea nuove istanze di struct mystruct e li aggiunge a un elenco:

while ( some_condition )
{
  char inputString[SIZE];
  if ( getInput( inputString ) )
  {
    struct mystruct *newStruct = usestring( inputString );
    addEntry( list, newStruct );
    ...
  }
}

Ogni istanza di newStruct nella lista finirà per puntare alla stessa stringa; ancora meglio, quel puntatore non sarà più valido dopo la chiusura del ciclo while .

In questo caso particolare , dovresti fare una copia della stringa di input e archiviarla nella struct. Ovviamente, questo apre domande su come recuperare la memoria, chi è la responsabile, ecc.

    
risposta data 07.08.2014 - 18:36
fonte

Leggi altre domande sui tag