comment déclarer une structure (un type) en c définit par;
une chaine de caractères
la longueur de cette chaine
taille de l'espace alloué pour contenir la chaine
comment déclarer une structure (un type) en c définit par;
une chaine de caractères
la longueur de cette chaine
taille de l'espace alloué pour contenir la chaine
Bonjour,
Voila comment declarer une structure :
Voila, le typedef permet d'avoir un genre d'alias pour la structure. Lorsque tu declerera une variable du type de ta structure tu pourra ecrire ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 struct ma_struct { char *ma_chaine; int size; }; typedef struct ma_struct mon_type;
La taille (en octets) que prendra ta chaine en memoire sera la meme que sa size puisqu'un char prend un octet (0 a 255).
Code : Sélectionner tout - Visualiser dans une fenêtre à part mon_type ma_variable;
Cordialement,
Neroptik
Mais dans ce cas, machaine doit pointer sur une chaîne de caractères, et non contenir une chaîne de caractères. size contiendra la taille en octets (bytes) du bloc pointé.
Je propose par contre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 typedef struct { char s[50]; size_t longueur, capacite; } st_chaine ; ... st_chaine ch; ch.capacite = 50; /* ou ch.capacite = sizeof(ch.s); */ strcpy(ch.s, "abc"); ch.longueur = 3; /* ou ch.longueur = strlen(ch.s); */
berk !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 typedef struct { char s[50]; size_t longueur, capacite; } st_chaine ;
Et quid si la chaine depasse 50
Pourquoi ne pas garder un pointeur ?
C'est beaucoup plus souple
a l'initialisation on fait un calloc de s d'une taille utille que l'on met dans capacité
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 typedef struct { char *s; size_t longueur, capacite; } st_chaine ;
Ensuite s devient dynamique et rien n'empeche de faire un realloc
La proposition de melem est bien moins dangereuse :
* moins de risques de segfaults dues à :
* * un oubli d'allocation
* * un free d'un buffer partagé par deux structs alors qu'une des structs l'utilise encore
* modification d'une struct qui entraîne une modification non prévue d'une autre
* fuites de mémoire
Après tout dépend de ce que l'on veut faire, si :
* on a des chaînes de longueur imprévisible
* on veut calculer la mémoire au plus juste
* on a beaucoup de ces structs utilisées dans le programme
* on veut pouvoir partager les chaînes de caractères entre plusieurs structs
Alors ok pour le pointeur et malloc/realloc. Mais c'est pas la solution la plus simple à mettre en oeuvre.
Sinon y'a aussi la solution en C99 de déclarer la struct ainsi (chaîne en fin de struct) :
et de décider de la taille du tableau à l'allocation. C'est un entre deux, moins souple que ta solution olibara, plus que celle de melem, mais qui impose de ne pas s'emmêler les pinceaux avec la taille du tableau imprévisible.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 struct une_struct { type un_champ; char ma_chaine[]; }
[Edit] J'oubliais, la solution de melem a l'avantage de permettre de s'affranchir complètement de l'allocation dynamique, suivant le cas... Ça peut être un sacré avantage !
[Edit2] chapines == chaînes; Elle m'énerve cette faute de frappe, elle m'énerve !!!
@huit_six : bien vu. La question venant d'un débutant, il faut savoir donner des réponses accessibles à tout débutant, pas des réponses d'expert à expert. Si l'apprenti fait preuve de plus de curiosité, c'est la seulement qu'il faut l'initier à quelques trucs avancés. C'est une méthode d'enseignement largement utilisée.
Partager