char * msg = new char[65546];
veulent initialiser à 0 pour chacun d'eux. quelle est la meilleure façon de le faire en C++?
char * msg = new char[65546]();
Il est connu sous le nom d'initialisation de valeur et a été introduit en C++ 03. S'il vous arrive de vous retrouver pris au piège au cours d'une décennie précédente, vous devrez utiliser std::fill()
(ou memset()
si vous voulez prétendre que c'est C).
Notez que cela ne fonctionnera pas pour toute valeur autre que zéro. Je pense que C++ 0x offrira un moyen de le faire, mais je suis un peu en retard, donc je ne peux pas en parler.
MISE À JOUR: il semble que mes réflexions sur le passé et l'avenir de la langue ne sont pas entièrement exactes; voir les commentaires pour les corrections.
La façon "la plus C++" de procéder serait d'utiliser std::fill
.
std::fill(msg, msg + 65546, 0);
En l'absence d'une très bonne raison de faire autrement, j'utiliserais probablement:
std::vector<char> msg(65546, '\0');
quelle est la meilleure façon de le faire en C++?
Parce que vous l'avez demandé de cette façon:
std::string msg(65546, 0); // all characters will be set to 0
Ou:
std::vector<char> msg(65546); // all characters will be initialized to 0
Si vous travaillez avec des fonctions C qui acceptent char * ou const char *, vous pouvez faire:
some_c_function(&msg[0]);
Vous pouvez également utiliser la méthode c_str () sur std :: string si elle accepte const char * ou data ().
L'avantage de cette approche est que vous pouvez faire tout ce que vous voulez faire avec un tampon de caractères à allocation dynamique mais de manière plus sûre, flexible et parfois encore plus efficace (en évitant d'avoir à recalculer la longueur de chaîne de manière linéaire, par exemple). Mieux encore, vous n'avez pas à libérer la mémoire allouée manuellement, car le destructeur le fera pour vous.
Cette méthode utilise la fonction 'C' memset , et est très rapide (évite une boucle char par char).
const uint size = 65546;
char* msg = new char[size];
memset(reinterpret_cast<void*>(msg), 0, size);
memset(msg, 0, 65546)
La méthode de type C peut ne pas être aussi attrayante que les autres solutions à cette question, mais ajoutée ici pour être complète:
Vous pouvez initialiser avec des valeurs NULL comme ceci:
char msg[65536] = {0};
Ou pour utiliser des zéros, tenez compte des éléments suivants:
char msg[65536] = {'0' another 65535 of these separated by comma};
Mais ne l'essayez pas comme pas possible , alors utilisez memset!
Dans le second cas, ajoutez ce qui suit après le memset si vous souhaitez utiliser msg comme chaîne.
msg[65536 - 1] = '\0'
Les réponses à cette question fournissent également des informations supplémentaires.
Vous pouvez utiliser une boucle for. mais n'oubliez pas que le dernier caractère doit être un caractère nul!
char * msg = new char[65546];
for(int i=0;i<65545;i++)
{
msg[i]='0';
}
msg[65545]='\0';