Le premier exemple ne fonctionne pas lorsque vous allez supprimer le pointeur. Le programme est soit suspendu lorsque j'ajoute le terminateur null ou sans cela, je reçois:
assertion de débogage Échec de l'expression: _block_type_is_valid (pHead-> nblockeuse) code> de Visual Studio 2008 P>
//Won't work when deleting pointer:
char *at = new char [3];
at = "tw"; // <-- not sure what's going on here that strcpy does differently
at[2] = '\0'; // <-- causes program to hang
delete at;
//Works fine when deleting pointer:
char *at = new char [3];
strcpy(at,"t");
at[1] = 'w';
at[2] = '\0';
delete at;
9 Réponses :
Dans le premier exemple, vous chantez la valeur à, dans la seconde, vous modifiez la valeur de ce que les points à l'adresse. L'attribution d'un char * à une double chaîne citée l'attribue à un pointeur constant statique. P>
en particulier, dans le premier exemple fait maintenant pointe un emplacement différent en mémoire. P>
Dans l'exemple const char * s = "bonjour monde; code>,
s code> est un pointeur sur un Const Char i>, pas un pointeur const I> à un char. Il y a tellement de fautes de frappe dans votre réponse ... En outre, je suppose que vous avez peut-être censé dire "Affectation d'une chaîne de double cote à un
char * code> plutôt que l'inverse? Comme vous ne pouvez rien attribuer à un littéral à chaîne, c'est-à-dire un littéral à chaîne ne peut jamais être sur le LHS?
Il y a 3 choses à comprendre: strong> 1) 2) 3) aussi que vous devriez aussi Ne jamais modifier un littéral à chaîne. C'est à dire. Cela ne devrait jamais être fait: p> La mémoire des littéraux de chaîne doit être en lecture seule et si vous le modifiez, les résultats sont indéfinis par la langue C ++. p> puisque vous utilisez c ++, veuillez envisager d'utiliser le type char * at; code> est juste une variable de pointeur.
Une variable de pointeur signifie simplement qu'il contient une adresse mémoire. p> nouveau caractère [3] code> retourne l'adresse de départ de la mémoire allouée sur le tas. p>
"bonjour" code> renvoie l'adresse du littéral de chaîne. p>
STD :: String CODE> TYPE au lieu. p>
N'oubliez pas d'utiliser chaque fois que vous allouez quelque chose avec []. P> P>
Lorsque vous faites Vous écrivez essentiellement la valeur du pointeur (c'est-à-dire l'adresse de la mémoire allouée pour vous par C'est une mauvaise chose à faire. P> en C et C ++, les affectations aux pointeurs ne font généralement rien à la mémoire en cours de pointe, ils changent le pointeur lui-même. Cela pourrait être déroutant si vous êtes habitué à une langue où les chaînes sont plus des "citoyens de première classe". P> Aussi, vous devez utiliser nouveau [] code>) avec le adresse d'une chaîne constante statique. Cela signifie que lorsque vous supprimez ultérieurement cette mémoire em>, vous passez
Supprimer code> un pointeur non renvoyé par
Nouveau p>
Suppr [] code> si vous avez utilisé
nouveau [] code>. p> p>
Donc, je serais correct dans la supposition de Strcpy (var, "string") à travers chaque caractère individuel de "chaîne" et l'attribue à l'index correct en var?
@Omar: Oui, StrcPy () écrira un personnage à la fois, jusqu'à la fin du caractère NIL qui terminait.
Un pointeur contient une adresse. L'opérateur = pour un pointeur change l'adresse tenue.
at[2] = '\0';
" à [2] = '\ 0'; code> ajoute un null à la fin de la matrice Compiler" - Ceci invoque UB en tant que littéraux à chaîne (le tableau créé par le compilateur que vous parlez de ) sont en lecture seule et ne doivent jamais être modifiés. Mais je suppose que tu savais ça; Je voulais juste le souligner pour que d'autres lisent votre réponse.
Dans votre premier exemple, vous allociez une certaine mémoire et vous l'indique avec la variable "à". Lorsque vous faites
at = "tw"
Dans le premier exemple, vous avez provoqué une fuite de mémoire.
Votre variable Si vous Pensez aux pointeurs comme entiers, cela aura probablement plus de sens. J'ai assigné des nombres arbitraires en tant qu'adresses de discussion. P> à code> est un pointeur sur une adresse mémoire, pas la chaîne elle-même. Lorsque vous attribuez l'adresse de
"TW" code> au pointeur, vous avez perdu l'adresse d'origine que vous avez obtenue avec
nouveau code>.
à code> indique maintenant une adresse que vous n'avez pas allouée avec
nouveau code>, vous ne pouvez donc pas
supprimer code> it. p>
Parce qu'un Un littéral à chaîne en C (et donc en C ++) comme Char * code> n'est pas une chaîne. C'est juste un pointeur à un personnage, avec la Convention qu'il pourrait y avoir plus de caractères à suivre et qu'après le dernier, il existe un
'\ 0' code>.
"ABC" code> est juste un tableau de caractères, avec le compilateur en silence en silence d'un
'\ 0' code>. Lorsque vous attribuez un tableau à un pointeur, le tableau convertit silencieusement un pointeur vers le premier élément. Le résultat est que P>
at = "tw";
Vous vous trompez deux choses: faire pointer le point de pointeur à quelque chose de différent (c'est ce que l'affectation) et la copie de certaines données à un endroit pointé par le pointeur.
char *at = new char [3]; strcpy(at,"t");
Je suppose que vous vouliez dire
Suppr [] code>
Vous avez répondu à votre propre question. Strcpy () attribue des caractères au tableau. = attribue un nouveau tableau. Le débogueur montre effectivement quelque chose de différent. La valeur de "à" change dans un cas et non dans l'autre.
FYI, faire
at = "tw"; code>, puis
à [2] = '\ 0'; code> est redondant.
"TW" code> crée un littéral de chaîne déjà i> NULL-TARNINÉ. La mémoire de la chaîne
"TW" code> ressemble à
['T' | 'w' | '\ 0'] code>. Non seulement cela, mais
à [2] = '\ 0'; code> entraînera également un comportement non défini;
"TW" code> crée un littéral à chaîne, qui est une chaîne lecture seule i> une chaîne non écrite i>, donc écrit sur ce littéral à chaîne en lecture seule invoquer un comportement non défini. Pour attribuer quelque chose de cette façon, vous devez faire
const char * at = "tw"; code> qui créera un littéral à chaîne et avoir
à code> point sur le même emplacement .