Créer dynamiquement un tableau de chaînes de caractères avec la fonction malloc
Je suis en train de créer un tableau de chaînes de caractères en C, en utilisant malloc
. Le nombre de chaînes que le tableau tiendra peut changer au moment de l'exécution, mais la longueur des chaînes sera toujours cohérents.
J'ai tenté ce (voir ci-dessous), mais éprouve de la difficulté, des astuces dans la bonne direction sera très appréciée!
#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 être en mesure d'utiliser le tableau pour ce faire:
strcpy(orderedIds[0], string1);
strcpy(orderedIds[1], string2);
/* etc */
- Notez que vous ne devriez pas être à l'aide de
int
s ici. a) Il est signé (et je doute que vous voulez de -5 longueur de la chaîne), et b) il n'est pas garanti d'être à la bonne taille pour tenir les valeurs dont vous avez besoin pour tenir. Utiliser lesize_t
type pour le stockage des index de tableau d'objet et de tailles. C'est le type de l'argument demalloc
. - cela dit, c'est la garantie d'être assez grand pour
5
.
Vous devez vous connecter pour publier un commentaire.
Vous devez affecter un tableau de pointeurs de char, et ensuite, pour chaque pointeur affecter suffisamment de mémoire pour la chaîne:
Semble être une bonne façon pour moi. Même si vous effectuez de nombreux mallocs, vous avez clairement affecter la mémoire pour une chaîne de caractères spécifique, et vous pouvez libérer un bloc de mémoire sans libérer l'ensemble de la "chaîne de tableau"
Étant donné que les chaînes sont toutes de longueur fixe (sans doute au moment de la compilation?), vous pouvez effectuer les opérations suivantes:
Un plus lourd, mais plus général, la solution consiste à attribuer à un tableau de pointeurs, et les pseudo-initialisation à point sur les éléments d'un raw de la sauvegarde de tableau:
orderedIds[0]
?malloc
. Aussi, vous êtes déclarantorderedIds
comme un tableau plutôt qu'un pointeur, ce qui signifie que vous ne pouvez pas lui attribuer. Aussi, vous êtesmalloc
ing un grand bloc pour toutes les données de caractère, puis un moulage d'unchar **
qui est très différent.char[][ID_LEN + 1]
vous ne pouvez pas le traiter comme unchar **
.char **
attend de vous que vous avez des pointeurs vers les données qui sont stockées ailleurs. Il n'est pas stocké dans la mémoire dynamique la même façon qu'un tableau à deux dimensions est stockée dans la pile.