Размер буфера: N * sizeof (тип) или sizeof (var)? C ++ - PullRequest
1 голос
/ 29 мая 2010

Я только начинаю с cpp, и я следую различным примерам, чтобы поучиться у них, и я вижу, что размер буфера устанавливается по-разному, например:

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

VS

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

Как правильно его использовать?

Я видел это в других функциях, таких как InternetReadFile, ZeroMemory и MultiByteToWideChar.

Ответы [ 4 ]

4 голосов
/ 29 мая 2010

Ни один из них не является правильным.

Вы используете StringCchPrintf (), который работает с количеством символов, а не байтов. sizeof (buffer) возвращает размер буфера в байтах, как и 255 * sizeof (char). 255 * sizeof (char) также имеет недостаток в том, что вы дублируете размер массива в двух местах - если вы измените размер буфера, но забудете при вызове StringCchPrintf, у вас будет ошибка.

Это работает, так как sizeof (char) всегда равен 1.

Вы также указываете буфер как char, но используете TEXT () вокруг строки - компиляция с UNICODE приведет к разрыву.

Любое из следующих правил будет правильным:

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);
0 голосов
/ 29 мая 2010

Вы должны использовать константы для размера, а не целые числа, как вы.

Согласно Microsoft, правильная форма для расчета того, что вы хотите, это:

размер массива / размер массива [0]

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

Кроме того, sizeof не идеален, поскольку в некоторых случаях он возвращает размер указателя, а не размер массива. Термин РАЗМЕР в этом случае немного вводит в заблуждение, потому что вы должны спросить себя - что я на самом деле получаю РАЗМЕР ?

0 голосов
/ 29 мая 2010

sizeof(buffer) будет работать для статически размещенного массива, но не для динамически размещаемого массива:

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;

Имея это в виду, я бы рекомендовал всегда использовать N * sizeof (тип) для согласованности и во избежание мелких ошибок.

0 голосов
/ 29 мая 2010

Учитывая два вышеупомянутых варианта, первый значительно лучше, так как он не повторяет «магическую константу» 255. Если вы хотите, чтобы второй вариант был конкурентоспособен с первым, вы должны сделать это как

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