51 votes

Créer dynamiquement un tableau de chaînes avec malloc

J'essaie de créer un tableau de chaînes en C en utilisant malloc . Le nombre de chaînes que le tableau contiendra peut changer au moment de l'exécution, mais la longueur des chaînes sera toujours cohérente.

J'ai essayé cela (voir ci-dessous), mais j'ai des problèmes, tout conseil dans la bonne direction sera très apprécié !

 #define ID_LEN 5
char *orderedIds;
int i;
int variableNumberOfElements = 5; /* Hard coded here */

orderedIds = malloc(variableNumberOfElements * (ID_LEN + 1));

En fin de compte, je veux pouvoir utiliser le tableau pour faire ceci:

 strcpy(orderedIds[0], string1);
strcpy(orderedIds[1], string2);
/* etc */

77voto

MByD Points 78505

Vous devez affecter un tableau de pointeurs de caractère, puis, pour chaque pointeur, affecter suffisamment de mémoire pour la chaîne :

 char **orderedIds;

orderedIds = malloc(variableNumberOfElements * sizeof(char*));
for (int i = 0; i < variableNumberOfElements; i++)
    orderedIds[i] = malloc((ID_LEN+1) * sizeof(char)); // yeah, I know sizeof(char) is 1, but to make it clear...

Cela me semble un bon moyen. Bien que vous effectuiez de nombreux mallocs, vous affectez clairement de la mémoire à une chaîne spécifique et vous pouvez libérer un bloc de mémoire sans libérer l'ensemble du "tableau de chaînes"

6voto

Oli Charlesworth Points 148744

Étant donné que vos chaînes sont toutes de longueur fixe (probablement au moment de la compilation ?), vous pouvez effectuer les opérations suivantes :

 char (*orderedIds)[ID_LEN+1]
    = malloc(variableNumberOfElements * sizeof(*orderedIds));

// Clear-up
free(orderedIds);

Une solution plus lourde, mais plus générale, consiste à affecter un tableau de pointeurs et à les pseudo-initialiser pour pointer sur des éléments d'un tableau de support brut :

 char *raw = malloc(variableNumberOfElements * (ID_LEN + 1));
char **orderedIds = malloc(sizeof(*orderedIds) * variableNumberOfElements);

// Set each pointer to the start of its corresponding section of the raw buffer.
for (i = 0; i < variableNumberOfElements; i++)
{
    orderedIds[i] = &raw[i * (ID_LEN+1)];
}

...

// Clear-up pointer array
free(orderedIds);
// Clear-up raw array
free(raw);

6voto

sahaj Points 675
char **orderIds;

orderIds = malloc(variableNumberOfElements * sizeof(char*));

for(int i = 0; i < variableNumberOfElements; i++) {
  orderIds[i] = malloc((ID_LEN + 1) * sizeof(char));
  strcpy(orderIds[i], your_string[i]);
}

0voto

Roman Points 7430

#define ID_LEN 5
char **orderedIds;
int i;
int variableNumberOfElements = 5; /* Hard coded here */

orderedIds = (char **)malloc(variableNumberOfElements * (ID_LEN + 1) * sizeof(char));

..

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X