Pourquoi avons-nous besoin de strdup ()?

Pendant que je travaillais sur une mission, j’ai appris que nous ne devrions pas utiliser de tâches telles que

char *s="HELLO WORLD"; 

Les programmes utilisant de telles syntaxes risquent de tomber en panne.

J’ai essayé et utilisé:

  int fun(char *temp) { // do sum operation on temp // print temp. } fun("HELLO WORLD"); 

Même ce qui précède fonctionne (bien que le résultat soit compilateur et spécifique à la norme).

Au lieu de cela, nous devrions essayer strdup () ou utiliser const char *

J’ai essayé de lire d’autres questions similaires sur le blog, mais je ne pouvais pas comprendre le concept POURQUOI LE CODE SUPÉRIEUR DEVRAIT TRAVAILLER.

La mémoire est-elle allouée? Et quelle différence fait Const ??

Permet de clarifier les choses un peu. Vous n’avez jamais besoin spécifiquement de strdup . C’est juste une fonction qui alloue une copie d’un caractère char* sur le tas. Cela peut être fait de différentes manières, y compris avec des tampons basés sur une stack. Ce dont vous avez besoin, c’est le résultat, une copie modifiable d’un caractère char* .

Le code que vous avez répertorié est dangereux parce qu’il passe ce qui est en réalité une chaîne constante d’un littéral de chaîne dans un emplacement qui attend une chaîne mutable. Ceci est malheureusement autorisé dans la norme C mais est toujours dangereux. Écrire en chaîne constante produira des résultats inattendus et provoquera souvent des plantages. La fonction strdup résout le problème car elle crée une copie mutable qui est placée dans un emplacement qui attend une chaîne mutable.

Les littéraux de chaîne sont stockés dans le segment de données du programme. Manipuler leurs pointeurs modifiera le littéral chaîne, ce qui peut conduire … à des résultats étranges au mieux. Utilisez strdup() pour les copier dans un espace alloué par tas ou par stack.

Les littéraux de chaîne peuvent être stockés dans des parties de la mémoire qui ne disposent pas de privilèges d’écriture. Tenter de leur écrire provoquera un comportement indéfini. const signifie que le compilateur s’assure que le pointeur n’est pas écrit, garantissant que vous n’appelez pas un comportement indéfini de cette manière.

C’est un problème en C. Bien que les littéraux de chaîne soient des caractères char * vous ne pouvez pas les modifier, ils sont donc en fait const char* .

Si vous utilisez gcc , vous pouvez utiliser -Wwrite-ssortingngs pour vérifier si vous utilisez correctement les littéraux de chaîne.

Lisez ma réponse sur (tableau et chaîne) Différence entre Java et C. Il contient la réponse à votre question dans la section relative aux chaînes.

Vous devez comprendre qu’il existe une différence entre l’allocation statique et l’allocation mémoire et que vous n’avez pas recours aux mêmes espaces mémoire.