Realloc un tableau de Structures
Je suis en train de réallouer dynamiquement de la mémoire pour un tableau de struct (en fait une matrice de chacune des 2 structures, mais 1 inclus ici pour plus de simplicité) qui est lu à partir de/vers un fichier ou saisie par l'utilisateur.
typedef Struct
{
char surname[21];
char firstname[21];
char username[21];
...
} User;
...dans main():
int size = 0; /* stores no. of structs */
User* user_array = (User *) calloc(1, sizeof(User));
if(user_array == NULL)
{
printf("Cannot allocate initial memory for data\n");
exit(1);
}
else
size++;
Je suis d'essayer d'utiliser un appel de fonction pour augmenter le tableau en cas de besoin:
int growArray(User user_array*, int size)
{
User *temp;
size++;
temp = (User *) realloc(user_array, (size * sizeof(User));
if(temp == NULL)
{
printf("Cannot allocate more memory.\n");
exit(1);
}
else
user_array = temp;
return size;
}
Malheureusement, le realloc ne fonctionne jamais. Les deux structures sont que d'environ 200 octets par exemple et le réglage de la taille initiale-à-dire 10 fonctionnera très bien, donc il doit y avoir quelque chose de mal avec la façon dont je suis en train d'utiliser realloc.
Système Win 7 64, sur Core i5 avec 4 go, l'exécution de Quincy (un MinGW GUI).
int growArray(User user_array, int size)
? Vous manque un*
?- post le vrai code ne compile pas
- Je pense qu'il manque deux d'entre eux.
- Si vous obtenez cela fonctionne, vous pouvez simplifier le code en faisons aussi de la répartition initiale avec growArray. Aussi, soyez conscient que votre calloc() permet d'initialiser la première entrée, tandis que la postérieure realloc() va quitter la zone d'extension non initialisée. Comme cnicutar notes, la "taille++" ne sera pas visible à l'appelant.
- dantje - pour le moment je suis en utilisant la taille de ma valeur de retour - désolé pour le laisser sortir
- cette chose que vous appelez la taille doit être appelée longueur
- ce serait plus précis que je suis de ne pas stocker. d'éléments dans le tableau. Dans mon programme (trop long d'énumérer ici), il est no_elements
Vous devez vous connecter pour publier un commentaire.
Vous êtes à la modification de la valeur de user_array localement. La valeur est perdue lorsque la fonction retourne. Passer un pointeur vers la user_array pointeur à la place.
realloc
modifie la taille de la mémoire pointée paruser_array
à la taille spécifiée, il n'a pas l'augmenter en taille. Voyant que votre fonction est appeléegrowArray
, j'avais suppose que vous le souhaitez augmenter la taille de la matrice parsize
, dans ce cas, vous devez:Noter que
growArray
prend l'adresse deuser_array
, la raison pour cela est querealloc
peut-être déplacer la mémoire si elle ne pouvait pas étendre l'interdiction à la taille requise.Pour l'utiliser:
realloc
pourrait ne pas être en mesure d'étendre votreuser_array
pointeurs bloc de mémoire à être assez grand pour la nouvelle taille. Si cela se produit, il alloue un nouveau bloc de mémoire quelque part d'autre, et des copies de tout, de lauser_array
plus. La valeur de retour est le nouvel emplacement de la mémoire. En utilisant le pointeur vers un pointeur permetgrowArray
pour mettre à jour la valeur deuser_array
de l'appelant, que sa valeur précédente est maintenant invalide.