Passaggio di matrici multidimensionali in C.
-
05-07-2019 - |
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,
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:
- Forse dovresti assegnare qualcosa a array_size in make (...)?
- strdup (char *) alloca memoria, il malloc per array [i] non è necessario.
- 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 = ...
dimensione viene dichiarata ma non viene assegnato alcun valore (ciò dovrebbe accadere nella funzione make, suppongo).