Retourner aux forums || Retourner au forum Programmation.c
Programmation.c : problème de struct et d'alignement
Posté par RB () le 04 janvier 2007
#include <stdio.h>;
typedef struct {
int row;
int col;
} *Pos;
typedef struct {
char* t;
int a;
int b;
int c;
Pos cur;
} *Doc;
int main(int argc, char *argv[])
{
Doc doc = malloc(sizeof(Doc));
Pos cur = malloc(sizeof(Pos));
cur->;row = 1;
doc->cur = cur;
printf("val: %d", doc->;cur->;row);
return 0;
}
Me donne:
% gcc test.c && ./a.out
val: 134520856
Si je supprimme a, b ou c de la struc, le résultat correct de 1 revient. J'aimerais comprendre pourquoi ce problème arrive (alignement ?) et qu'est ce que je fais de faux dans mon code.
Voili, merci d'avance.
PS: désolé pour les caractères plus grand et plus petit apparaissant faux, je n'arrive pas à les faire sortir justes...
> Lire le message (6 commentaires, moyenne: 2,2).
les ;
Question peut-être bête, mais c'est normal tous ces ";" ?
On vous ment! Mais pas moi...
Type struct != type pointeur
Tu a définis Doc et Pos directement comme étant des types "pointeur vers structure" au lieu "structure"; tes deux malloc utilisent donc le sizeof de ces pointeurs (soit 4 octets sur une machine 32 bits) au lieu de la taille réelle des structures.
Tes deux variables "doc" et "cur" vont donc se retrouver allouées dans la ram avec une taille de 4 octets alors qu'elles en ont besoin de plus, et les acces de leurs champs vont alors déborder. Par exemple là, quand tu écris la valeur de doc->cur, tu vas en fait taper pile à l'emplacement mémoire de cur->row :)
Tu pourrais corriger rapidement avec "malloc(sizeof(&Doc))" pour avoir la taille réellement nécessaire; mais je trouve que ça fait beaucoup de circonvolutions et que ça embrouille le cerveau.
Définis plutot tes types de structure en tant que structure ("typedef struct {...} Doc" au lieu de "*Doc") et déclare des variables explicitement pointeurs
(Doc *doc, Pos *cur;), ce sera plus clair.
-
[^]Re: Type struct != type pointeur
Posté par alveric () le 04/01/2007 à 15:43. (lien). Évalué à 3.tes deux malloc utilisent donc le sizeof de ces pointeurs (soit 4 octets sur une machine 32 bits)
La taille d'un pointeur n'est pas forcément 4 octets, même si c'est usuel sur les architectures 32 bits (au regard de la norme C, ça peut être 1, 2, 8, 15...).
Tu pourrais corriger rapidement avec "malloc(sizeof(&Doc))" pour avoir la taille réellement nécessaire; mais je trouve que ça fait beaucoup de circonvolutions et que ça embrouille le cerveau.
Petite erreur: "*doc". "&Doc" ne compilera pas (on ne peut prendre l'adresse d'un type).
Définis plutot tes types de structure en tant que structure ("typedef struct {...} Doc" au lieu de "*Doc") et déclare des variables explicitement pointeurs
C'est une question de style (voir mon autre post plus bas)...
(Doc *doc, Pos *cur;), ce sera plus clair.
-
[^]Re: Type struct != type pointeur
Erreur de typage et malloc
#include <stdio.h>;Le point-virgule est en trop.
typedef struct {
int row;
int col;
} *Pos;
Tu définis le type Pos comme pointeur sur une structure anonyme (on va dire "aPos").
typedef struct {
/*...*/
} *Doc;
Idem pour Doc.
int main(int argc, char *argv[])
{
Doc doc = malloc(sizeof(Doc));
Pos cur = malloc(sizeof(Pos));
Deux erreurs :
- Il faut vérifier le retour de *alloc ;
- sizeof(Doc) retourne la taille du type Doc, i.e. pointeur sur la structure anonyme "aDoc". Or, ce que tu veux, c'est allouer un espace mémoire suffisant pour une structure "aDoc".
typedef struct {
int row;
int col;
} aPos;
typedef aPos *Pos;
/*...*/
Pos cur = malloc(sizeof(aPos));
Mais cette solution demande de redéfinir tes structures de données, donc c'est assez intrusif (peut-être avais-tu une bonne raison pour laisser le type structure anonyme). Il y a donc une autre solution, qui es tà la fois plus simple et plus maintenable :
Pos cur = malloc(sizeof *cur)Avec cette dernière, sizeof *cur détermine la taille correcte, quel que soit le type de cur, ou la manière dont il a été défini (*).
cur->;row = 1;Erreur de syntaxe, ton programme ne devrait même pas compiler (ou alors le point-virgule est arrivé là durant le copié-collé ?).
-
[^]Re: Erreur de typage et malloc
Posté par RB () le 04/01/2007 à 15:53. (lien). Évalué à 1.Merci beaucoup pour ces explications.
Non je n'avais pas de raison de laisser mes structures anonymes, je supposais simplement toujours les utiliser sous forme de pointeurs. Quelle peut etre une bonne raison d'avoir des structures anonymes ?
Les erreurs de syntaxes proviennent du combat entre moi et l'apperçu de mon post sur linuxfr :-)
Revenir en haut de page || Retourner aux forums || Retourner au forum Programmation.c



Cette discussion est archivée, il n'est plus possible de laisser des commentaires.
Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.