Domanda

Attualmente sto cercando di imparare C e ho riscontrato un problema che non sono stato in grado di risolvere.

Si consideri:

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

#define ELEMENTS 5

void make(char **array, int *array_size) {
    int i;
    char *t = "Hello, World!";

    array = malloc(ELEMENTS * sizeof(char *));

    for (i = 0; i < ELEMENTS; ++i) {
        array[i] = malloc(strlen(t) + 1 * sizeof(char));
        array[i] = strdup(t);
    }
}

int main(int argc, char **argv) {
    char **array;
    int size;
    int i;

    make(array, &size);

    for (i = 0; i < size; ++i) {
        printf("%s\n", array[i]);
    }

    return 0;
}

Non ho idea del perché quanto sopra non riesca a rileggere il contenuto dell'array dopo averlo creato. Ho letteralmente passato un'ora a cercare di capire perché non funziona ma sono uscito a mani vuote. Senza dubbio è qualcosa di banale.

Saluti,

È stato utile?

Soluzione

Ecco il codice di lavoro:

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

#define ELEMENTS 5

void make(char ***array) {
    char *t = "Hello, World!";

    *array = malloc(ELEMENTS * sizeof(char *));

    int i;
    for (i = 0; i < ELEMENTS; ++i) {
        (*array)[i] = strdup(t);
    }
}

int main(int argc, char **argv) {
    char **array;
    make(&array);

    int i;
    for (i = 0; i < ELEMENTS; ++i) {
        printf("%s\n", array[i]);
        free(array[i]);
    }
    free(array);
    return 0;
}

Come hanno pubblicato gli altri - c'erano dimensioni inutilizzate e strdup alloca memoria da sola, ed è bello liberare la memoria in seguito ...

Altri suggerimenti

Devi passare l'indirizzo di " array " nella funzione. Cioè, hai bisogno di char ***. Questo perché è necessario modificare il valore dell'array allocando la memoria ad esso.

EDIT: solo per renderlo più completo, nella dichiarazione di funzione devi avere qualcosa come

void make(char ***array, int *array_size)

Quindi devi chiamarlo usando

make(&array, &size);

All'interno della funzione make , alloca memoria con

*array = malloc(ELEMENTS * sizeof(char *));

E cambia altri luoghi di conseguenza.

Inoltre, come ha sottolineato kauppi, strdup alloca memoria per te, quindi non è necessario eseguire malloc su ogni stringa.

Vedi il commento di PolyThinker che è assolutamente perfetto.

Oltre al modo in cui passi l'array, dovresti verificare alcuni altri problemi:

  1. Forse dovresti assegnare qualcosa a array_size in make (...)?
  2. strdup (char *) alloca memoria, il malloc per array [i] non è necessario.
  3. Dovresti liberare tutta la memoria che assegni dopo che non ti serve più.

Stai passando il valore corrente dell'array da creare come copia (in pila). quando cambi array in make (), stai solo cambiando la copia, non la variabile reale. Prova a passare per riferimento con & amp; oppure rendilo un carattere *** e lavora con * array = ...

La

dimensione viene dichiarata ma non viene assegnato alcun valore (ciò dovrebbe accadere nella funzione make, suppongo).

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