2014-09-05 12 views
2

Je suis en train de concaténer deux chaînes en une nouvelle (finalString) comme ceci: finalString = string1 + « & » + chaîne2C++ allocation dynamique des valeurs initiales

Tout d'abord, j'allouent la mémoire pour finalString, puis J'utilise strcat(). Je suppose que string1 est "Mixt" et string2 est "Supermarket".

La sortie ressemble à ceci:

═════════════════řřřř  //(which has 21 characters) 
═════════════════řřřřMixt&Supermarket 

Je sais que si je l'utilise entre parenthèses dans « nouveau char » la chaîne sera initialisé à 0 et je vais obtenir le résultat souhaité, mais ma question est pourquoi la première sortie a-t-elle 21 caractères, en supposant que j'ai alloué seulement 17. Et même ainsi, pourquoi la longueur de chaîne finale dépasse-t-elle la taille d'allocation initiale (21> 17)?

Merci d'avance!

+2

Une raison pour laquelle vous ne pouvez pas utiliser ['std :: string'] (http://en.cppreference.com/w/cpp/string/basic_string)? –

+2

'finalString' commence non initialisé, il s'agit donc d'un comportement indéfini. Vous devez définir le premier élément sur 0 (par exemple 'finalString [0] = 0;') –

+0

Vous avez tort lorsque vous dites "la chaîne sera initialisée à 0". – Barmar

Répondre

0

« dépassement de la mémoire tampon »

Deux mots pour vous La raison pour laquelle vous avez 21 caractères est d'abord parce qu'il ya un caractère «/0 » (également appelé null) 22 caractères loin de l'adresse de mémoire que les points finalString à. Cela peut ou peut ne pas être cohérent en fonction de ce qui est dans votre mémoire. En ce qui concerne la raison pour laquelle vous avez une longueur plus longue que ce que vous vouliez à nouveau, vous avez écrit en dehors de la mémoire tampon initiale dans la mémoire aléatoire. Vous n'êtes pas tombé en panne parce que vous n'avez pas écrit quelque chose d'important.Strcat prendra l'adresse de mémoire donnée, trouve le premier '/ 0' qu'il trouve et à partir de là il copiera les données du second pointeur de mémoire que vous fournissez jusqu'au premier '/ 0' qu'il y trouve. Ce que vous faites est TRÈS DANGEREUX, si vous ne frappez pas un/0 'avant d'avoir atteint quelque chose de vital, vous causerez un crash ou au moins un mauvais comportement.

Sous-couche en C/C++ a char [] est juste un pointeur sur l'emplacement initial de la mémoire du premier élément. IL N'Y A PAS DE SAUVEGARDE! Vous seul devez faire attention à cela ..

Si vous définissez le premier caractère de la chaîne finale [0] = 0 alors vous la logique fonctionnera mieux.

0

Comme une réponse différente, pourquoi ne pas utiliser std::string:

std::string a, b, c; 
a = "part1"; 
b = "part2"; 
c = a + " & " + b; 
std::cout << c << '\n'; 

part1 & part2 

Un exemple concret: http://ideone.com/pjqz9T

Il vous rendra la vie plus facile! Vous devriez toujours chercher à utiliser les types stl avec c++.

Si vous avez vraiment besoin d'un char * puis à la fin vous pouvez faire c.c_str().

+0

Ce n'est pas ma question. Je me demande pourquoi le premier cout imprime 21 caractères et non 17, puisque seulement 17 sont alloués. –

+0

@IanFulgeanu c'est bien, c'est une façon différente et plus facile de faire ce que vous voulez, si vous avez besoin d'utiliser des tableaux de char, alors je suis sûr que vous avez une raison. –

0

Votre chaîne n'est pas initialisée, ce qui entraîne un comportement indéfini. Dans strcat, la chaîne sera ajoutée lorsqu'elle trouve le caractère nul.

Ainsi, comme d'autres déjà mentionnés, que ce soit vous pouvez faire finalString[0] = 0;

ou à la place de votre première utilisation strcatstrcpy. Cela va copier la première chaîne et mettre un caractère nul à la fin.

Pourquoi 21 caractères?

Ceci est dû à un comportement indéfini. Il continuera à imprimer jusqu'à ce qu'il ne trouve pas de null ou bien il se bloquera dès qu'il essayera d'accéder à n'importe quelle mémoire illégale.