bonsoir a vous tous je viens vers vous pour une question, j'apprend le c et là je suis arrivée aux chaines de caractère bizarrement quand j'ai créé un tableau de 26 cases et lu un prénom comme Stéphane il le stock et il n'y a pas de problème c'est que même en changeant la taille en mettant 3 cases et a nouveau je sauvegarde et je compile et j'exécute il n'ya pas d'erreur est ce que quelqu'un peut m'expliquer pourquoi il n'y pas overflow comme dans les tableau d'entiers par exemple ? merci
Lorsqu'il y a un débordement de tableau, ce qui arrive n'est pas déterminé. C'est un bug de type undefined behavior. Tout peut arriver, y compris que ça fonctionne.
c'est relativement simple ça fonctionne car, une chaine de caractère se finit par '\0' et quand tu utilise printf (par exemple il se base sur ce '\0' pour savoir que la chaine est finie, même si la mémoire n'est pas alloué à un tableau. Attention c'est pas parce que ça tombe en marche qu'il faut le faire, car ta chaine de caractère peut empiéter dans une zone alloué pour autre chose et là tu cours à la catastrophe. Imagine :
bonsoir a vous tous je viens vers vous pour une question, j'apprend le c et là je suis arrivée aux chaines de caractère bizarrement quand j'ai créé un tableau de 26 cases et lu un prénom comme Stéphane il le stock et il n'y a pas de problème c'est que même en changeant la taille en mettant 3 cases et a nouveau je sauvegarde et je compile et j'exécute il n'ya pas d'erreur est ce que quelqu'un peut m'expliquer pourquoi il n'y pas overflow comme dans les tableau d'entiers par exemple ? merci
Si on voyait le code, on comprendrait mieux de quoi il s'agit.
- Edité par michelbillaud 20 décembre 2018 à 16:25:03
#include <stdio.h>
int main()
{
int a = 5;
int b = 5;
char prenom[1];
printf("Avant a = %d, b = %d\n", a, b);
printf("c'est quoi ton nom ?\n");
scanf("%s",prenom);
printf("tu tapelles ->%s\n",prenom );
printf("Apres a = %d, b = %d\n", a, b);
return 0;
}
- Edité par joel76 23 décembre 2018 à 10:07:31
Le crayon la gomme et le papier sont les meilleurs outils du programmeur !
je te remercie joel76 grâce a toi j'ai bien compris c'est que même si je donne une seule case à une chaine de caractère et son contenu dépasse, elle piétinera sur la suite des variables ou cases mémoires existantes merci infiniment .
Dans le scanf tu donnes l'adresse où ranger la chaine qui sera saisie au clavier.
En C, on dit que le programmeur sait ce qu'il fait.
Donc scanf range la totalite de la chaîne plus l'octet 0 final des chaines de caractères à partir de l'adresse donnée. Comme tu as indiqué au compilateur que ta chaine ne prendrait qu'un seul caractère celui-ci a obéi et n'a laisse qu'un seul caractère de libre puis crée à côté les places pour ranger les autres variables a et b du programme.
Chez moi les variables a et b ont été modifiées après la saisie de mon pseudo, il est possible qu'une seule des deux variables a ou b soit modifiée sur ta machine, je pense que ça dépend du compilo utilisé et des options de compilation, un expert du C pourrait t'expliquer tout ça en détail.
Lorsqu'on veut stocker une chaine de caractères il faut bien calculer sa longueur et ajouter le 0 final de la chaine sinon tu auras des problèmes de débordement qui sont imprévisibles (quelques fois il ne se passe rien et le jour où tu présentes ton projet au prof ça plante !) Ceci fait partie "des joies du C".
Le crayon la gomme et le papier sont les meilleurs outils du programmeur !
la connaissance est une chose qui ne nous appauvrit pas quand on la partage.
Mon GitHub
Le crayon la gomme et le papier sont les meilleurs outils du programmeur !
Le crayon la gomme et le papier sont les meilleurs outils du programmeur !