Éditeurs de liens, chargeurs et exécutables
L'exécution de « char *p = "hello"; p[0] = 'H'; » en C provoque une terminaison anormale dans de nombreux environnements. Quelle en est la raison ?
- ALa chaîne était placée sur la pile et avait disparu au retour de la fonction
- BLe littéral de chaîne est placé dans .rodata, protégé en écriture, et l'on a tenté d'y écrire
- Cp avait été initialisé à 0
Afficher la réponse et l'explication
Réponse : B. Le littéral de chaîne est placé dans .rodata, protégé en écriture, et l'on a tenté d'y écrire
Les littéraux de chaîne comme "hello" et les constantes globales déclarées const sont placés dans une zone de données en lecture seule (.rodata). L'écriture étant interdite sur ces pages, une tentative d'écriture est détectée par le CPU comme une violation de protection, et l'OS arrête le programme (erreur de segmentation). Pour pouvoir la modifier, on écrit « char s[] = "hello"; » : le tableau crée une copie dans une zone inscriptible.
Continuer : 9 autres questions sur Éditeurs de liens, chargeurs et exécutables