2010-06-28 7 views
32
char * msg = new char[65546]; 

souhaitez initialiser à 0 pour tous. Quelle est la meilleure façon de faire cela en C++?comment initialiser un tableau char?

+3

Le meilleur moyen est de ne jamais utiliser 'new' manuellement comme ça. Utilisez un 'std :: vector'. – GManNickG

+0

memset ou calloc. – eemz

Répondre

52
char * msg = new char[65546](); 

Il est connu comme valeur d'initialisation, et a été introduit en C++ 03. Si vous vous retrouvez coincé dans une décennie précédente, alors 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 commenter cela. MISE À JOUR: il semble que mes réflexions sur le passé et l'avenir de la langue ne sont pas tout à fait exactes; voir les commentaires pour les corrections.

+0

+1 pour la solution idéale :-). –

+0

Cela fonctionne très bien car 0 est la valeur intégrale par défaut pour un 'char'. –

+5

@Eric, cela n'a rien à voir avec OOP: S –

4
memset(msg, 0, 65546) 
+0

Rappelez-vous que '#include ' –

+0

Est-ce que sizeof (char) est garanti à 1? Je ne l'ai jamais vu non plus, mais à moins que cela ne soit garanti par la norme, j'utiliserais 'memset (msg, 0,65546 * sizeof (char)), juste pour être sûr. –

+9

@Paul: 'sizeof (char)' est garanti à 1. –

6

Cette méthode utilise la fonction 'C' memset, et est très rapide (évite une boucle char-by-char).

const uint size = 65546; 
char* msg = new char[size]; 
memset(reinterpret_cast<void*>(msg), 0, size); 
+8

pas besoin de la distribution, implicite T * à void * est autorisé en C++, mais pas implicitement void * à T * –

+5

... pour ne pas mentionner que la distribution appropriée ici serait 'static_cast'. – avakar

+0

Et 'std :: fill' est beaucoup mieux de toute façon. Tout compilateur moderne utilisera 'memset' quand il le peut, inutile d'être inconsistant. – GManNickG

16

La façon la plus «C++» de le faire serait d'utiliser std::fill.

std::fill(msg, msg + 65546, 0); 
+1

+1, (tout à fait) typesafe et facile à lire. Bien que je préférerais & msg [0], & msg [65546] (aussi je pense que 65536 est la taille prévue =) –

8

quelle est la meilleure façon de le faire dans C++?

Parce que vous avez demandé 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 le faire:

some_c_function(&msg[0]); 

Vous pouvez également utiliser la méthode c_str() sur std :: stri ng s'il accepte const char * ou data(). L'avantage de cette approche est que vous pouvez faire tout ce que vous voulez faire avec un buffer char alloué dynamiquement mais de manière plus sûre, flexible et parfois même plus efficace (en évitant de recalculer linéairement la longueur de la chaîne, par exemple). Mieux encore, vous n'avez pas besoin de libérer la mémoire allouée manuellement, car le destructeur le fera pour vous.

+2

+ 1 pour prendre du recul par rapport à la question et suggérer comment cela devrait probablement être fait. –

14

En l'absence d'une très bonne raison de faire autrement, je serais probablement utiliser:

std::vector<char> msg(65546, '\0'); 
+6

+ 1 lorsque l'utilisateur a demandé le meilleur moyen C++. :-D – stinky472

1

Vous pouvez utiliser une boucle. 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'; 
+0

Je suis assez sûr que l'OP voulait que le tableau initialisé à tous les zéros (alias nulls) pas à tous ''0' ':-) –

0

La méthode C comme peut ne pas être aussi attrayant que les autres solutions à cette question, mais il a ajouté ici pour être complet:

Vous pouvez initialiser avec NULLs comme ceci:

char msg[65536] = {0}; 

ou utiliser des zéros considèrent comme suit:

char msg[65536] = {'0' another 65535 of these separated by comma}; 

Mais ne cherchent pas comme not possible, alors utilisez memset!

Dans le second cas, ajoutez ce qui suit après le memset si vous souhaitez utiliser msg sous la forme d'une chaîne.

msg[65536 - 1] = '\0' 

Les réponses à this question fournissent également d'autres informations.

+0

@HJ: édité, merci. OP voulait zéro, si vous utilisez [ASCII] (http://www.theasciicode.com.ar/ascii-printable-characters/number-zero-ascii-code-48.html) '0' est le même que Chr (48)? –

+0

Le mot "zéro" est ambigu lorsque vous parlez d'un caractère, mais il * habituellement * signifie null plutôt que le caractère ASCII "0". Je crois que l'OP signifiait un tableau de null plutôt qu'un tableau plein du caractère zéro, ne serait-ce que parce que ce dernier est peu susceptible d'être utile. Mais ça ne blesse pas ta réponse pour expliquer comment faire les deux. –

+0

... sauf que je * pense * que votre deuxième fragment de code ne mettra qu'un seul "0" dans le tableau? Avez-vous essayé? –

Questions connexes