É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 ?

  1. ALa chaîne était placée sur la pile et avait disparu au retour de la fonction
  2. BLe littéral de chaîne est placé dans .rodata, protégé en écriture, et l'on a tenté d'y écrire
  3. 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.

S'entraîner sur ce thème Retour au thème

Autres questions sur Éditeurs de liens, chargeurs et exécutables

  1. Parmi les variables globales ci-dessus, quelle combinaison correspond à celles généralement placées dans la section .bss ?
  2. Où est placée pendant l'exécution une variable locale (variable automatique) sans static déclarée dans une fonction C ?
  3. De quelle zone du processus provient généralement la mémoire allouée par malloc en C ?
  4. Quel est l'agencement mémoire correct d'un processus typique sous Linux notamment, des adresses basses aux adresses hautes ?
  5. Quel est l'avantage de l'agencement qui fait croître le tas et la pile d'un processus en sens opposés, avec un vaste espace libre entre eux ?

Comparatifs sur ce thème