2010-05-28 7 views
1

Je commence avec cpp et j'ai suivi des exemples différents pour apprendre d'eux, et je vois que la taille de la mémoire tampon est définie de différentes façons, par exemple:Taille du tampon: N * sizeof (type) ou sizeof (var)? C++

char buffer[255]; 
StringCchPrintf(buffer, sizeof(buffer), TEXT("%s"), X); 

VS

char buffer[255]; 
StringCchPrintf(buffer, 255*sizeof(char), TEXT("%s"), X); 

Laquelle est la bonne façon de l'utiliser?

J'ai vu cela dans d'autres fonctions comme InternetReadFile, ZeroMemory et MultiByteToWideChar.

Répondre

4

Aucun des deux n'est correct.

Vous utilisez StringCchPrintf(), qui fonctionne sur le nombre de caractères, pas sur octets. sizeof (buffer) renvoie la taille du buffer en octets, tout comme 255 * sizeof (char). 255 * sizeof (char) a aussi l'inconvénient de dupliquer la taille du tableau à deux endroits - si vous changez la taille du buffer mais oubliez l'appel de StringCchPrintf, vous avez un bug.

Cela se produit au travail depuis sizeof (char) est toujours 1.

Vous spécifiez également en tant que char buffer, mais utilisez du texte() autour de la chaîne - compilation avec UNICODE provoquera une pause.

Tous les produits suivants serait correct:

char buffer[255]; 
StringCchPrintf(buffer, ARRAYSIZE(buffer), "%s", X); 

TCHAR buffer[255]; 
StringCchPrintf(buffer, ARRAYSIZE(buffer), TEXT("%s"), X); 

char buffer[255]; 
StringCbPrintf(buffer, sizeof(buffer), "%s", X); 

TCHAR buffer[255]; 
StringCbPrintf(buffer, sizeof(buffer), TEXT("%s"), X); 
+1

'sizeof (char)' retourne toujours 1 en C, quelle que soit la plate-forme (et même si la taille réelle est moindre, comme un grignotage). – zneak

+1

Je devrais également noter que 'sizeof (char)' renvoie 1 même dans les cas où 'char' est plus de 8 bits. – zneak

+0

Le dernier "sizeof (buffer)" pour le tableau TCHAR est faux! Utilisez _countof() au lieu de _sizeof() ou utilisez sizeof (buffer)/sizeof (TCHAR). – Stefan

0

Compte tenu des deux variantes, le premier est bien meilleure, car elle ne se répète pas la « magie constante » ci-dessus 255. Si vous vouliez la deuxième variante pour être compétitif avec d'abord, vous devez le faire comme

const size_t BUFFER_SIZE = 255; 
char buffer[BUFFER_SIZE]; 
StringCchPrintf(buf, BUFFER_SIZE*sizeof(char), TEXT("%s"), X); 
+1

Si cela est juste dépend de ce que la fonction veut. Si elle veut la quantité de __bytes__, alors c'est vrai, si elle veut la quantité de __objects__, alors c'est faux. Mais même dans ce dernier cas, comme c'est le cas, le '... * sizeof (char)' est tout à fait inutile.'sizeof (char)' par définition est toujours 1, donc vous pouvez l'omettre pour 'char', et si le type va jamais changer, '... * sizeof (char)' n'aide pas vraiment non plus, puisque il répète explicitement le type. Pourquoi pas 'BUFFER_SIZE * sizeof (buffer [0])'? (Et si ce buffer n'est pas alloué dynamiquement, 'sizeof (buffer) * sizeof (buffer [0])' fonctionne bien aussi.) – sbi

0

sizeof(buffer) travaillera pour un tableau statique alloué mais pas pour un tableau alloué dynamiquement:

char buffer[255]; 
cout << sizeof(buffer) << endl; // prints 255 
char *p = new char[255]; 
cout << sizeof(p) << endl;  // prints 8 (on a 64-bit machine) 
delete[] p; 
return 0; 

Dans cet esprit, je recommande toujours en utilisant N * sizeof (type) pour des raisons de cohérence et pour éviter les bugs subtils.

0

Vous devez utiliser des constantes pour la taille, pas des entiers comme vous l'avez fait.

par Microsoft, la forme correcte pour calculer ce que vous voulez est ceci:

tableau sizeof/tableau sizeof [0]

http://msdn.microsoft.com/en-us/library/4s7x1k91%28VS.71%29.aspx

Aussi, sizeof est pas parfait parce que dans certains cas il retournera la taille du pointeur et non la taille du tableau. Le terme TAILLE de est un peu trompeur dans ce cas, parce que vous devez vous demander - qu'est-ce que je reçois réellement le TAILLE DE?

+0

Quelque part enterré dans un en-tête Windows, il existe une macro de préprocesseur appelée '_countof' qui s'étend essentiellement à ce qui précède. – dreamlax

Questions connexes