3
votes

C Le message de type de pointeur incompatible apparaît pour répertorier les types de pointeurs identiques pour les

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.


1 commentaires

Pourquoi définissez-vous la structure dans main () ?


3 Réponses :


4
votes

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?


0 commentaires

-1
votes

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.


1 commentaires

Ne lancez jamais le résultat de malloc: stackoverflow.com/a/605858/3742943



0
votes

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.


0 commentaires