Dans le langage C, les chaînes sont implémentées comme des tableaux de caractères, se terminant par un octet nul ('\0'). Exemple de déclaration d'une chaîne :
char str1[] = "hello"; // Tableau avec 6 caractères : {'h','e','l','l','o','\0'} char *str2 = "hello"; // Pointeur vers un littéral de chaîne
const).Pour éviter les erreurs :
malloc, strcpy, vérifiez la taille du tampon).\0.Exemple de traitement correct d'une chaîne :
char buffer[100]; strcpy(buffer, "test"); // OK, buffer est modifiable et contient garantis '\0'
Quel sera le résultat de l'exécution du code suivant et quelles erreurs provoquera-t-il ?
char *str = "hello"; str[0] = 'H'; printf("%s ", str);
Réponse : Le programme conduira à un comportement indéfini, très probablement un segfault, car les littéraux de chaîne sont placés en mémoire en lecture seule. Il n'est pas possible d'écrire des valeurs à l'adresse d'un littéral de chaîne.
Histoire L'équipe a confondu les concepts de tableau de chaîne et de pointeur vers un littéral. Une fonction prenait
char *output = "default";et exécutait ensuitestrcpy(output, input);, ce qui entraînait un plantage au premier lancement, car la copie se faisait dans de la mémoire en lecture seule.
Histoire Lors du traitement des réseaux, le résultat a été enregistré dans un tampon alloué avec
char *buf = NULL; strcpy(buf, data);. Cela a conduit à une écriture dans une mémoire non initialisée et à un plantage de l'application.
Histoire Dans un package de localisation, l'équipe transmettait des chaînes entre les composants sans s'assurer que le caractère
\0était ajouté. Un jour, une fonction a affiché des déchets dans la console et a corrompu la structure interne de la mémoire.