1 pièce(s) jointe(s)
Allocation de mémoire et initialisation d'un tableau de structures par une fonction
Bonjour,
Après un cours élémentaire sur les structures et l'allocation de mémoire, j'en ai repris les éléments dans le fichier joints pour vérifier si j'avais bien compris. Ce programme compile mais l'exécution pose des problèmes.
Mon but est d'allouer la mémoire nécessaire à un tableau de structures de taille variable, d'en initialiser les champs de chaque élément du tableau et de vérifier le résultat en imprimant le tableau après initialisation. C'est un cas d'école qui n'a rien d'ambitieux.
J'ai réalisé cette tâche de deux façons différentes :
1 - allocation de mémoire dans le main() + initialisation du tableau dans le main() + impression dans le main().
Cette partie du programme s'exécute parfaitement.
2 - allocation de mémoire dans une fonction + initialisation du tableau dans la même fonction + impression dans le main().
Tout semble bien se passe dans la fonction où l'impression locale du tableau initialisé est correcte. Par contre, l'impression dans le main() ne fonctionne pas et le programme s'arrête.
Je pense que cela provient d'une gestion inadaptée des pointeurs mais je n'arrive pas à trouver la solution.
J'ai eu récemment un cours de base sur les pointeurs et je vois bien que je n'ai pas tout assimilé.
Si vous voyez où j'ai fait une erreur de débutant, je vous remercie par avance de l'aide que vous pourrez m'apporter,
Cordialement vôtre,
getud78
tableaux de structures en argument
Citation:
Envoyé par
dalfab
Bonjour,
La valeur du pointeur
tab_pers_2 est transmise à la fonction
créer_tab() qui met à jour sa copie qui s'appelle
tab.
Ensuite
main() utilise
tab_pers_2 qui n'a pas changée (donc qui vaut toujours
NULL) et l'utiliser va planter.
Une fonction ne peut pas modifier une données externe, transmettre l'adresse de
tab_pers_2 est indispensable
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| /*...*/
void creer_tab( int dim , mapersonne** ptab ) {
/*...*/
mapersonne *tab = malloc( dim * sizeof(mapersonne) ); // tab est locale
*ptab = tab; // on met à jour via pointeur la variable de l'appelant
/*...*/
}
int main() {
/*...*/
creer_tab( nb_pers , &tab_pers_2 );
/*...*/
} |
Ou bien on fait l'inverse, c'est plus simple : la fonction
créer_tab() calcule un
tab, en retourne la valeur. Et cette valeur de retour est à copier dans
tab_pers_2 :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| /*...*/
mapersonne* creer_tab( int dim ) {
mapersonne *tab;
/*...*/
return tab;
}
int main() {
/*...*/
tab_pers_2 = creer_tab( nb_pers );
/*...*/
} |
Bonsoir,
Merci pour ces explications qui m'ont fait comprendre les erreurs que j'avais faites.
Je intégré ces concepts dans mon code et tout fonctionne parfaitement.
Cela m'a été d'une grande aide,
Cordialement,
getud78