10
votes

Pourquoi un pointeur doit-il avoir un tableau de charcuterie besoin Strcpy d'affecter des caractères à son réseau et que la mission de guillemets ne fonctionnera pas?

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;


3 commentaires

Je suppose que vous vouliez dire Suppr []


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"; , puis à [2] = '\ 0'; est redondant. "TW" crée un littéral de chaîne déjà NULL-TARNINÉ. La mémoire de la chaîne "TW" ressemble à ['T' | 'w' | '\ 0'] . Non seulement cela, mais à [2] = '\ 0'; entraînera également un comportement non défini; "TW" crée un littéral à chaîne, qui est une chaîne lecture seule une chaîne non écrite , 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"; qui créera un littéral à chaîne et avoir à point sur le même emplacement .


9 Réponses :


0
votes

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.

en particulier, dans le premier exemple fait maintenant pointe un emplacement différent en mémoire.


1 commentaires

Dans l'exemple const char * s = "bonjour monde; , s est un pointeur sur un Const Char , pas un pointeur const à 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 * 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?



9
votes

Il y a 3 choses à comprendre:

1) char * at; est juste une variable de pointeur.
Une variable de pointeur signifie simplement qu'il contient une adresse mémoire.

2) nouveau caractère [3] retourne l'adresse de départ de la mémoire allouée sur le tas.

3) "bonjour" renvoie l'adresse du littéral de chaîne. xxx

une note concernant la lecture de la mémoire en lecture seule:

aussi que vous devriez aussi Ne jamais modifier un littéral à chaîne. C'est à dire. Cela ne devrait jamais être fait: xxx

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 ++.

puisque vous utilisez c ++:

puisque vous utilisez c ++, veuillez envisager d'utiliser le type STD :: String TYPE au lieu. xxx


0 commentaires

5
votes

N'oubliez pas d'utiliser xxx

chaque fois que vous allouez quelque chose avec [].


0 commentaires

14
votes

Lorsque vous faites xxx

Vous écrivez essentiellement la valeur du pointeur (c'est-à-dire l'adresse de la mémoire allouée pour vous par nouveau [] ) avec le adresse d'une chaîne constante statique. Cela signifie que lorsque vous supprimez ultérieurement cette mémoire , vous passez Supprimer un pointeur non renvoyé par Nouveau

C'est une mauvaise chose à faire.

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".

Aussi, vous devez utiliser Suppr [] si vous avez utilisé nouveau [] .


2 commentaires

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.



4
votes

Un pointeur contient une adresse. L'opérateur = pour un pointeur change l'adresse tenue.

at[2] = '\0';


1 commentaires

" à [2] = '\ 0'; 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.



0
votes

Dans votre premier exemple, vous allociez une certaine mémoire et vous l'indique avec la variable "à". Lorsque vous faites

at = "tw"


0 commentaires

0
votes

Dans le premier exemple, vous avez provoqué une fuite de mémoire.

Votre variable à est un pointeur sur une adresse mémoire, pas la chaîne elle-même. Lorsque vous attribuez l'adresse de "TW" au pointeur, vous avez perdu l'adresse d'origine que vous avez obtenue avec nouveau . à indique maintenant une adresse que vous n'avez pas allouée avec nouveau , vous ne pouvez donc pas supprimer it.

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. xxx


0 commentaires

12
votes

Parce qu'un 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>.

Un littéral à chaîne en C (et donc en C ++) comme "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";


0 commentaires

0
votes

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");


0 commentaires