7 votes

Char Array VS Char *

Il s'agit d'une question basée sur les réponses de la question :

const char myVar* vs. const char myVar[]

const char* x = "Hello World!";
const char  x[] = "Hello World!";

Je comprends maintenant la différence, mais mes nouvelles questions sont les suivantes :

(1) Qu'arrive-t-il à la chaîne "Hello World" de la première ligne si je réassigne x ? Rien ne pointera vers elle à ce moment-là - sera-t-elle détruite à la fin de la portée ?

(2) En dehors de la constance, comment les valeurs dans les deux exemples sont-elles stockées différemment en mémoire par le compilateur ?

10voto

wberry Points 6068

Placer "Hello World!" dans votre code fait que le compilateur inclut cette chaîne dans l'exécutable compilé. Lorsque le programme est exécuté, cette chaîne est créée en mémoire avant l'appel à la fonction main et, je crois, avant même l'appel de l'assemblée à __start (qui est le moment où les initialisateurs statiques commencent à fonctionner). Le contenu de char * x ne sont pas alloués en utilisant new o malloc ou dans le cadre de la pile de main et ne peut donc pas être désalloué.

Cependant, un char x[20] = "Hello World" déclarée au sein d'une fonction ou d'une méthode est allouée sur la pile, et tant qu'elle est en vigueur, il y aura en fait deux copies de cette méthode "Hello World" en mémoire - un préchargé avec l'exécutable, un dans le tampon alloué par la pile.

4voto

stanley Points 47

Le compilateur stocke le premier dans une section de la mémoire appelée RODATA (read-only data). Tant que le programme est en cours d'exécution, la mémoire conserve sa valeur initiale.

Le second est stocké comme n'importe quel autre tableau - sur la pile. Comme n'importe quelle autre variable locale, elle peut être écrasée lorsque sa portée se termine.

-1voto

Nicola Musatti Points 10070
  1. Formellement, dans les deux cas, le "Hello World!" La chaîne de caractères est allouée dans la mémoire statique comme une séquence contiguë de char Il n'y a donc pas de mémoire allouée dynamiquement à récupérer ni d'instance de classe à détruire ;
  2. Les deux sites x seront alloués soit dans la mémoire statique, soit sur la pile, selon l'endroit où ils sont définis. Cependant, le pointeur sera initialisé de manière à pointer vers le fichier de données correspondant. "Hello World!" tandis que le tableau sera initialisé en copiant le littéral de la chaîne directement dedans.

En théorie, le compilateur est libre de récupérer la mémoire des deux chaînes littérales lorsqu'il n'y a aucun moyen d'y accéder ; en pratique, il est peu probable que la première soit récupérée, car la mémoire statique reste généralement allouée au programme jusqu'à sa fin ; d'un autre côté, si le tableau est alloué sur la pile, la seconde pourrait même ne pas être allouée du tout, car le compilateur peut utiliser d'autres moyens pour s'assurer que le tableau est correctement initialisé, et la mémoire du tableau sera récupérée lorsqu'elle sortira de sa portée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X