Erreur: En C, obtenu l'erreur “déréférencement du pointeur de type incomplète” dans une struct pointeur
Bonjour Tout Le Monde!
J'ai obtenu l'erreur suivante, tout en essayant de tester un code pour le jeu Clever Frog:
erreur: déréférencement de pointeur de type incomplète
Le "code complet" est à pastebin.com - ici (n'expirera pas). Mais je pense qu'avec l'explication ci-dessous, on comprend. Note: je n'ai pas encore mis en œuvre la fonction qui permet d'effacer la mémoire allouée et d'autres choses.
J'ai une structure définie dans un 1.fichier c:
#include "1.h"
...
struct test {
int a;
};
...
J'ai un 1.h wicth ont la définition de type de l'utiliser:
...
typedef struct test testT;
...
Puis j'ai une fonction qui a un paramètre en fonction de testT, qui est en 2.c:
...
void funcTest(testT **t, int *size, ..){
/* another function that creates mem.space/alocate memory based enter code here`on the need of size above */
createMem(t,*size); /* void createMem(testT **t, int size); */
t[0]->a = 0; /*ERROR HERE*/
/* ... more code ... */
}
...
Les 2.h fichier comme ceci:
...
void funcTest(testT **t, int *size, ..);
...
Je vais passer un testT *var que le chemin ci-dessous, dans la principale programam:
...
testT *varTest; int size;
funcTest(&varTest, &size);
...
La chose de bizarre, c'est que le code compile quand j'utilise struct test à 1.h fichier (suppression de struct test à partir de 1.c - ce qui est faux). Mais, lors de l'exécution du programme compilé, exactement là où l'erreur se produit est le lieu de t[0]->un.
J'ai déjà essayé "de tout", mais rien n'y fait 🙁 j'ai la foi, c'est quelque chose de très stupide, donc, si quelqu'un sait quelque chose, dites-le moi 😀
Merci!
OriginalL'auteur Shuryon | 2011-03-11
Vous devez vous connecter pour publier un commentaire.
Lorsque vous essayez d'accéder à la
a
membre de lat[0]
struct le compilateur doit savoir comment cette structure ressemble (par exemple pour voir si il n'y a même touta
membre en elle). Puisque vous n'avez pas mis lestruct test
définition de type de n'importe où, lorsque le compilateur peut le voir lors de la compilation de2.c
, vous obtiendrez une erreur. Le compilateur ne sait pas ce qu'est unstruct test
contient.Si vous mettez la définition de la
struct test
dans1.h
, le compilateur voit comment ce type ressemble et vous pouvez utiliser la les membres de la structure.Il suffit de mettre la complète de la définition de type de
1.h
, c'est là où il est censé être.struct test
je thugh qu'il était en *.c ettypedef
*.h Rus.. Quand je fais cela, je reçoissegmentation fault
à la position det[0]->a = 0
. je devrais avoir, a déclaré que l'od0
, il obtiendra une valeur à partir d'une entrée de l'utilisateur; ici: pastebin.com/ZbudbbVELe bon endroit est dans le *.h. À propos de l'erreur de segmentation: probablement cela signifie que
createMem
n'avait pas t[0] à point à quelque chose d'utile.OriginalL'auteur sth
Quelque part que vous avez une séquence de fichiers qui a
Qui ne comprennent pas les
Prétraitement inlines tous les #comprend les directives. Tant que vous n'utilisiez qu'une testT pointeur, le compilateur aurait connu à "allouer un pointeur vaut la peine de mémoire" et la compilation ont progressé plus que prévu.
Lorsque vous essayez d'utiliser le pointeur de déréférencement de quelque chose, le compilateur peut alors se rendre compte qu'il FALLAIT la définition complète de "struct test" et vous obtiendrez l'erreur affichée.
OriginalL'auteur Edwin Buck
Si vous voulez la structure pour être utilisable à la fois dans le 1.c et 2.c, il doit être défini dans un fichier d'en-tête qui est visible à la fois. Je ne sais pas pourquoi vous dites que c'est "mal", c'est une pratique courante et autant que je sache, il n'y a pas d'autre moyen de contourner cela directement.
Si c'est uniquement définie en 1.c, le compilateur n'a aucune idée de si
struct test
a un membre nommé "a" lors du traitement 2.c.Une autre option est de simplement continuer à l'avant de la déclaration que vous avez maintenant, mais qui comprennent aussi l'accesseur/mutateur fonctions dans l'en-tête. Puis 2.c n'a pas besoin de connaître les "entrailles" de
struct test
, mais peut agir sur elle. C'est aussi très courant dans C Api.(Vous pouvez également définir la structure de manière identique les deux en 1.c et 2.c mais c'est un très mauvaise idée.)
#include "1.h"
à 2.c. Le vrai code: pastebin.com/ZbudbbVE"1.h"
ne contient pas de définition destruct test
. Il dit seulement: "il y a une struct test quelque part" et définit un autre nom pour ce type. Avec juste que, quand on regarde"2.c"
, le compilateur ne sait pas ce questruct test
, il ne peut le faire de choses avec elle, qui ne nécessitent aucune connaissance de la structure (comme la manipulation de pointeurs).struct test
est un "opaque" à ce point. Vous souhaitez rechercher ce terme pour trouver plus d'informations.OriginalL'auteur Mat
La définition de
struct Test
n'est visible à l'intérieur du fichier de 1.c. Le codet[0]->a
ne pas voir que cette structure a un membre nomméa
. Les types partagé entre plusieurs unités de compilation devrait être définie dans un en-tête de!Vous devriez savoir que le C/C++ compile chaque .c fichier séparément, de sorte qu'il n'a aucun moyen de savoir que la structure est définie dans quelques autres .c fichier.
Vous devriez peut-être effectuer les opérations suivantes:
(1.h)
(1.c)
(2.c)
non, il n'est pas de cette façon: la définition de
positionLeaf
dans votre code est en matriz.c, pas matriz.h!Rus.. Le programme compile de cette façon, mais obtenir
segmentation fault
àmatriz[i]->row
lors de l'exécution du programme. À lefor
boucleil ne se compile pas, à mes côtés. J'ai collé le journal ici.
ou tu veux dire qu'il compile mon chemin? Pourriez vous s'il vous plaît copiez et collez le code qui segmentation?
OriginalL'auteur Vlad
Le pointeur vers la mémoire allouée est en fait dans
*t
, past
(comme on le voit à partir de votrecreateMatrix
code sur Pastebin), de sorte que vous devriez vraiment faire:et de même dans votre
for
boucle:error: invalid use of undefined type ‘struct positionLeaf’
Eh bien, vous êtes un mélange des deux types d'erreurs. Ma réponse était sur les erreurs d'exécution, ce que vous obtenez est une erreur de compilation (que d'autres ont discuté).
OriginalL'auteur casablanca