J'essaye d'écrire du code pour allouer dynamiquement de la mémoire à un tableau de structures. Je veux passer le pointeur associé à l'espace mémoire du tas à une autre fonction pour une utilisation ultérieure. L'exemple de code suivant est un exemple approximatif de ce que je veux faire (réduit par souci de concision):
In function âmainâ: c:24:5: warning: passing argument 2 of âcreate_passwordâ from incompatible pointer type [enabled by default] create_password(password_seeds, user_passwords); ^ c:8:6: note: expected âstruct password_struct *â but argument is of type âstruct password_struct *â void create_password(char password_seeds[], struct password_struct* user_passwords); ^
Lorsque j'essaye de compiler ceci, j'obtiens l'erreur suivante:
XXX
Apparaîtrait la liste des mêmes types de pointeurs pour les types de pointeurs réels et attendus. Toute aide serait grandement appréciée.
3 Réponses :
En effet, la définition de la structure password_struct
à l'intérieur de main ()
, et non visible en dehors de la portée.
Déplacez la définition de la structure dans la portée du fichier (en dehors de main ()
ou de toute autre fonction).
Cela dit, voyez celle-ci: Quelles sont les signatures valides pour la fonction main () de C?
struct password_struct * user_passwords = malloc (num_passwords * sizeof (struct password_struct));
Ici, vous créez de la mémoire pour password_struct. La fonction malloc renvoie le pointeur générique, donc la conversion de type est importante afin que vous puissiez convertir le pointeur générique en password_Struct. Alors essayez ceci
struct password_struct * user_passwords = (struct password_struct *) malloc (num_passwords * sizeof (struct password_struct));
Cette ligne peut résoudre votre problème.
Ne lancez jamais le résultat de malloc: stackoverflow.com/a/605858/3742943
Vous avez deux types de struct password_struct
différents - un défini au niveau global et un second défini comme local à main. Bien qu'ils aient le même nom, ils finissent par être deux types non liés, en raison de leur portée différente. La fonction est déclarée comme prenant un pointeur vers le global, mais dans main, vous utilisez un pointeur vers le local.
Pourquoi définissez-vous la structure dans
main ()
?