Pendant que je travaillais sur une mission, je suis venu savoir que nous ne devrions pas utiliser des tâches telles que:
int fun(char *temp)
{
// do sum operation on temp
// print temp.
}
fun("HELLO WORLD");
5 Réponses :
Les littéraux de chaîne sont stockés dans le segment de données du programme. La manipulation de leurs pointeurs modifiera le littéral à chaîne, ce qui peut conduire à des résultats étranges au mieux. Utilisez STRDUP () CODE> pour les copier à la place de l'espace de tas ou de la pile. P>
Même Const Char * S = "Bonjour" alloue l'espace pour le littéral sur la pile. Et nous utilisons une telle syntaxe pour contourner (même dans Printf (const Char * s, VLA).
@smartmuki: Cela n'alloit pas l'espace pour le littéral sur la pile, seul le pointeur au littéral est sur la pile.
@ Darron désolé bt qu'est-ce que c'est ?? Si je le prends pour Cons-Char * s, alors si l'espace n'est pas alloué sur la pile (et ni sur le tas), alors s'il est réellement alloué ?? (ou même alloué)
@smartmuki: Un seul pointeur est attribué sur la pile. Le littéral à chaîne existe toujours dans le segment de données et le pointeur pointe vers cela.
permet de clarifier un peu les choses. Vous n'avez jamais besoin spécifiquement de La raison pour laquelle le code que vous avez énuméré est dangereux est que cela passe ce qui est vraiment une chaîne constante dans le littéral de la chaîne dans une fente qui s'attend à une chaîne mutable. Cela est malheureusement autorisé dans la norme C mais ihhérentement dangereux. L'écriture à une chaîne constante produira des résultats inattendus et se bloque souvent. La fonction STRUP code>. C'est juste une fonction qui alloue une copie d'un char * code> sur le tas. Cela peut être fait de nombreuses manières différentes, y compris avec des tampons à base de pile. Ce dont vous avez besoin est le résultat, une copie mutable d'un char * code>. P>
strDUp code> corrige em> le problème car elle crée une copie mutable qui est placée dans une fente en attente d'une chaîne mutable. p>
Donc, si je n'essaie pas de modifier la chaîne (par exemple, je viens d'imprimer l'impression), il est donc sûr d'utiliser ces littéraux sans const ??
@smartmuki Il est légal selon la norme, mais uniquement pour des raisons de compat en arrière et reste une conversion dangereuse. Si vous définissez une fonction qui ne mute pas la chaîne, il est préférable de faire la bonne chose et de le déclarer comme const char * code>.
Je n'ai essayé que avec le compilateur GCC et sa présentation de la sortie attendue. Mais un compilateur peut-il donner une faute de segmentation pour ce qui précède? Et si c'est le cas, alors y ?? :(
Ceci est un problème dans C. Bien que les littéraux strings soient Si vous utilisez Char * CODE> Vous ne pouvez pas les modifier, ils sont donc efficacement Const Char * Code>. P>.
gcc code>, vous pouvez utiliser -wwring-strings code> pour vérifier si vous utilisez des littéraux de chaîne correctement. P>
Les littéraux de chaîne peuvent être stockés dans des portions de mémoire qui n'ont pas de privilèges d'écriture. Tenter de leur écrire entraînera un comportement indéfini. La const signifie que le compilateur garantit que le pointeur n'est pas écrit pour, garantissant que vous n'invoque pas un comportement indéfini de cette manière. P>
lire ma réponse sur (tableau et chaîne) Java et C . Il contient la réponse à votre question dans la section sur les chaînes. P>
Vous devez comprendre qu'il y a une différence entre une allocation statique et de la mémoire et que vous ne recourez pas vers les mêmes espaces mémoire. P>
Indice: qu'est-ce que "Const Char *" signifie "Char *" et pourquoi l'utiliser dans ce qui précède est bénéfique (par exemple, comment pourrait accéder à i> ou modifiant i> S1 ". crash")? Qu'est-ce que STRDUP permet de faire avec le 'const Char *'?
Char * s = "Hello World" code> est une initialisation, pas une mission. Quoi qu'il en soit, pourquoi pensez-vous que c'est mauvais?