Programmer en langage C
160
© Éditions Eyrolles
Par exemple, avec cette déclaration :
char * adr = "bonjour" ;
une expression telle que :
strlen (adr+2)
serait acceptée : elle aurait pour valeur 5 (longueur de la chaîne commençant en adr+2).
De même, dans l’exemple de programme du paragraphe 5.1, il serait tout à fait possible de
remplacer :
strcat (ch1, ch2) ;
par :
strcat (ch1, ch2+4) ;
Le programme afficherait alors simplement :
bonjoursieur
Plus curieusement, si l’on remplace cette fois cette même instruction par :
strcat (ch1+2, ch2) ;
on obtiendra le même résultat qu’avec le programme initial (bonjour monsieur) puisque
ch2 sera toujours concaténée à partir du même 0 de fin !
En revanche, avec :
strcat (ch1+10, ch2) ;
les choses seraient nettement catastrophiques : on viendrait écraser un emplacement situé en
dehors de la chaîne d’adresse ch1.
10.2 Les risques de modification des chaînes constantes
Nous avons vu que, dans une instruction telle que :
char * adr = "bonjour" ;
le compilateur remplace la notation "bonjour" par l’adresse d’un emplacement dans lequel
il a rangé la succession de caractères voulus.
Dans ces conditions, on peut se demander ce qui va se produire si l’on tente de modifier l’un
de ces caractères par une banale affectation telle que :
*adr = 'x' ;
/* bonjour va-t-il se transformer en xonjour ? */
* (adr+2) = 'x' ; /* bonjour va-t-il se transformer en boxjour ? */
Delannoy Livre.book Page 160 Mercredi, 6. mai 2009 4:26 16
160
© Éditions Eyrolles
Par exemple, avec cette déclaration :
char * adr = "bonjour" ;
une expression telle que :
strlen (adr+2)
serait acceptée : elle aurait pour valeur 5 (longueur de la chaîne commençant en adr+2).
De même, dans l’exemple de programme du paragraphe 5.1, il serait tout à fait possible de
remplacer :
strcat (ch1, ch2) ;
par :
strcat (ch1, ch2+4) ;
Le programme afficherait alors simplement :
bonjoursieur
Plus curieusement, si l’on remplace cette fois cette même instruction par :
strcat (ch1+2, ch2) ;
on obtiendra le même résultat qu’avec le programme initial (bonjour monsieur) puisque
ch2 sera toujours concaténée à partir du même 0 de fin !
En revanche, avec :
strcat (ch1+10, ch2) ;
les choses seraient nettement catastrophiques : on viendrait écraser un emplacement situé en
dehors de la chaîne d’adresse ch1.
10.2 Les risques de modification des chaînes constantes
Nous avons vu que, dans une instruction telle que :
char * adr = "bonjour" ;
le compilateur remplace la notation "bonjour" par l’adresse d’un emplacement dans lequel
il a rangé la succession de caractères voulus.
Dans ces conditions, on peut se demander ce qui va se produire si l’on tente de modifier l’un
de ces caractères par une banale affectation telle que :
*adr = 'x' ;
/* bonjour va-t-il se transformer en xonjour ? */
* (adr+2) = 'x' ; /* bonjour va-t-il se transformer en boxjour ? */
Delannoy Livre.book Page 160 Mercredi, 6. mai 2009 4:26 16
