Les littéraux de chaîne sont un cas particulier dans la langue. Regardons de plus près votre code pour mieux comprendre cela:
D'abord, vous allouez une mémoire tampon en mémoire, et d'assigner l'adresse de cette mémoire à str
:
char* str = (char*)malloc(20*sizeof(char));
Ensuite, vous attribuez une chaîne littérale à str
. Cela va remplacer ce que str
détenait précédemment, de sorte que vous perdrez votre tampon alloué dynamiquement, provoquant accidentellement une fuite de mémoire. Si vous souhaitez modifier le tampon alloué, vous devrez à un certain moment déréférencer str
, comme dans str[0] = 'A'; str[1] = '\0';
.
str = "This is a string";
Alors, quelle est la valeur de str
maintenant?Le compilateur place tous les littéraux de chaîne dans la mémoire statique, de sorte que la durée de vie de chaque chaîne littérale dans le programme est égale à la durée de vie du programme entier. Cette instruction est compilée à une affectation simple similaire à str = (char*)0x1234
, où 0x1234
est censé être l'adresse à laquelle le compilateur a mis la chaîne littérale.
Cela explique pourquoi cela fonctionne bien:
char* str = "This is a string";
S'il vous plaît noter également que la mémoire statique ne doit pas être changé lors de l'exécution, vous devez donc utiliser const char*
pour cette mission.
Alors, dans quel cas devons-nous allouer de l'espace mémoire?
Dans de nombreux cas, par exemple lorsque vous devez modifier le tampon. En d'autres termes; lorsque vous devez pointer vers quelque chose qui ne peut pas être une constante de chaîne statique.
Votre confusion concerne les pointeurs, pas l'allocation de mémoire dynamique. – ybungalobill
Qu'essayez-vous de réaliser: Il y a une autre alternative: 'char str [] =" Ceci est une chaîne ";' –
Pourquoi n'utilisez-vous pas 'std :: string'? –