Domanda

Buone feste! Ho una funzione che stampa i contenuti di un char ** che viene usato come un array per memorizzare un numero di stringhe. Il è dichiarata in questo modo:

char** commandArray = (char**)malloc(historySize);

dove historySize è un int insieme globale a 8, per ora. La matrice è popolato con comandi immessi dall'utente, in una sorta di coda circolare. Ci sono più di un paio di posti in cui mi può essere utile il contenuto del buffer di stampato, così ho fatto una funzione. Idealmente, la funzione prende un riferimento commandArray e loop attraverso di essa, stampando il contenuto. Ora, devo dire che i puntatori e riferimenti non sono il mio forte, quindi non sono proprio sicuro se sto facendo le cose correttamente. La funzione è simile al seguente:

    /* prints the contents of the history buffer */
void printHistory(char*** historyBuff)
{
    /* a counter for the loop */
    int loopIdx = 0;

    for (loopIdx = 0; loopIdx < historySize; loopIdx++)
    {
        /* print the current history item */
        printf ("\nhistoryBuff[%i] = %s\n", loopIdx, *historyBuff[loopIdx]);
        fflush(stdout);
    }
}

sto passando il mio char ** in funzione come questa:

printHistory (&commandArray);

Allo stato attuale, tutto compila bene, ma quando il programma stampa la storia, la funzione si blocca in qualche parte del ciclo e non stampa ciò che è nel char **. Quindi, la mia domanda è questa:? Sono forse passando commandArray correttamente, sono io che dichiara la funzione correttamente, e sono io dereferencing nel modo giusto nella funzione

Vi ringrazio in anticipo per qualsiasi aiuto o suggerimenti!

-Ben

È stato utile?

Soluzione

  1. Per rendere il vostro lavoro il codice così com'è, si dovrebbe dereferenziare in questo modo:

    (*historyBuff)[loopIdx]

    Il modo in cui hai scritto cose, [] avviene prima * a causa della precedenza degli operatori in C, e non è ciò che si desidera.

  2. È necessario allocare più spazio per l'array di comando. In questo momento non è in realtà abbastanza grande da contenere historySize char* di:

    char** commandArray = (char**)malloc(historySize * sizeof(char*));
    
  3. Non è necessario passare questo array "di riferimento". Si può solo dichiarare la funzione in questo modo:

    void printHistory(char** historyBuff)
    

    E passare commandArray direttamente. Hai solo bisogno di passare in un char*** se avete intenzione di modificare la matrice reale puntatore da qualche parte nella funzione (ad esempio, se avevi bisogno di realloc per fare più spazio).

  4. Per una funzione che consente di stampare solo le cose, si potrebbe andare un po 'oltre e dichiarare cose const. Si tratta di una "garanzia" per il chiamante (nella misura in cui si può garantire nulla in C) che non avete intenzione di modificare la matrice o le stringhe in esso:

    void printHistory(const char *const * historyBuff)
    

Altri suggerimenti

1.

malloc assegna un numero di bytes , non puntatori . Se historySize è il numero di puntatori di caratteri si assegnano, sarà necessario cambiare:

char** commandArray = (char**)malloc(historySize);

a:

char** commandArray = malloc( historySize * sizeof(char*) );

2.

Il tuo printHistory() non cambia il puntatore commandArray. Non è necessario passare un char***. Un char** farà.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top