#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...
# les ;
Posté par nats . Évalué à 1.
# Type struct != type pointeur
Posté par daggett . Évalué à 4.
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 alf . Évalué à 3.
Petite erreur: "*doc". "&Doc" ne compilera pas (on ne peut prendre l'adresse d'un type).
C'est une question de style (voir mon autre post plus bas)...
[^] # Re: Type struct != type pointeur
Posté par RB . Évalué à 1.
En fait j'avais déjà corrigé mon programme de la manière que tu décris, mais je ne comprenais tjs pas pourquoi cela ne marchait pas avant. Et évidemment je voulais comprendre.
# Erreur de typage et malloc
Posté par alf . Évalué à 3.
- 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".
Il fallait donc faire soit (code non testé) : 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 : 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 (*). Erreur de syntaxe, ton programme ne devrait même pas compiler (ou alors le point-virgule est arrivé là durant le copié-collé ?).(*)Bon, à l'exception d'un type incomplet où la définition de la structure ne serait pas visible.
[^] # Re: Erreur de typage et malloc
Posté par RB . Évalué à 1.
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 :-)
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.