Pour compléter la réponse de gérald, les formes correctes pour allouer une chaîne dans la pile sont:
const gchar *text1 = "bonjour";
gchar text2[] = "bonjour";
gchar *text3 = g_strdup ("bonjour");
La première méthode utilise un pointeur vers une chaine de caractères. Le contenu doit forcément être déclaré en const, car le compilateur tentera de placer la chaîne dans un segment de l'exécutable qui sera en lecture seule (segment .rodata - read only data dans le format ELF [ame="http://en.wikipedia.org/wiki/Executable_and_Linkable_Format"]ELF[/ame] des binaires Linux). Si tu essaies de modifier ce texte, tu auras une erreur de segmentation.
La deuxième méthode utilise est un tableau de caractères. Il s'agit d'un tableau alloué dans la pile, la chaîne peut donc être modifiée comme toute valeur se trouvant dans la pile, du moment que tu ne dépasses pas les limites imposées par la taille initiale du tableau (ici, 8 octets, 7 pour les lettres de bonjour, + 1 pour le caractère de fin de chaîne).
Enfin, la troisième méthode utilise un pointeur et alloue le texte dans le tas. g_strdup ne fait qu'allouer de la mémoire et copier la chaine qui lui est passée en paramètre dans cette mémoire nouvellement allouée. g_strdup_printf est utilisée quand la chaine à allouer peut varier, par exemple :
1 2
| int n_choux = 3;
char *text4 = g_strdup_printf ("j'ai mangé %d choux", n_choux); |
À noter que sizeof (text1) vaut sizeof (char *), soit 4 octets en 32 bits (la taille d'un pointeur), idem pour text3 et text4. En revanche, text2 étant un tableau, sizeof (text2) = 8, qui est ici la taille du tableau.
Partager