Dans quelques exemples de code donné par un professeur:C: strncpy plus de caractères qu'alloué puis impression ... sortie inattendue?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char alpha[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
printf("%s\n", alpha);
printf("%c\n", alpha[8]);
alpha[8] = 'Z'; /* segmentation fault if alpha is declared statically! */
printf("%d\n", sizeof(alpha));
printf("%d\n", strlen(alpha));
char x[10];
strncpy(x, alpha, 26);
/* strncpy() will NOT copy or append a '\0' */
printf("%s\n", x);
return EXIT_SUCCESS;
}
Lors de la première compilation et l'exécution, le programme segfaults en raison, de ce que je vois en quelques minutes de recherche sur Google, un mécanisme de protection gcc contre les dépassements de mémoire tampon (déclenchée par le printf("%s\n", x);
dans lequel x avait été rempli avec 26 octets d'alpha). C'est ce que je crois comprendre.
Cependant, lors de la désactivation du mécanisme de protection avec gcc -fno-stack-protecteur, la sortie que je vois est:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
I
27
26
ABCDEFGHZJKLMNOPQRSTUVWXYZKLMNOPQRSTUVWXYZ
I pensé que, depuis strncpy ne se termine pas nulle la chaîne, que lorsque X
est imprimé il pourrait effectivement imprimer la valeur complète de alpha
- mais en fait, il est l'impression de tous alpha
, et encore plus alpha
!
Quelqu'un peut-il donner un aperçu ici?
J'espérais qu'il y avait une raison déterministe que 'KLMNOPQRSTUVWXYZ' imprime directement après' ABCDEFGHZJKLMNOPQRSTUVWXYZ'; Je pense que si le caractère nul est venu après le Z, la deuxième sortie K-Z ne serait pas affichée. – Joseph
Vous ne copiez que 26 caractères, donc le caractère nul qui aurait pu être présent après 'Z' en alpha n'est pas copié. Mais, un tableau hors limite ne garantit toujours rien, car pour x seulement 10 octets ont été alloués, la mémoire après le 10ème octet de x ne vous appartient pas et peut être utilisée de toute façon – Jay
Bon point, merci! – Joseph