2010-05-28 3 views
1

Я только начиная с СРР и я следовал различные примеры, чтобы учиться у них, и я вижу, что размер буфера устанавливается по-разному, например:Размер буфера: N * sizeof (тип) или 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); 

Какой из них является правильным способом его использования?

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

ответ

4

Неправильно.

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

Это происходит на работу, так как SizeOf (Char) всегда 1.

Вы также указать буфер как полукокс, но использовать 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); 
+1

'sizeof (char)' всегда возвращает 1 в C, независимо от платформы (и даже если фактический размер меньше, как кусок). – zneak

+1

Следует также отметить, что 'sizeof (char)' возвращает 1 даже в тех случаях, когда 'char' составляет более 8 бит. – zneak

+0

Последний «sizeof (buffer)» для массива TCHAR неверен! Либо используйте _countof() вместо _sizeof(), либо используйте sizeof (buffer)/sizeof (TCHAR). – Stefan

0

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

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

Правильно ли это зависит от того, что хочет функция. Если он хочет количество __bytes__, тогда это правильно, если он хочет количество __объектов__, тогда это неправильно. Но даже в последнем случае, как это, '... * sizeof (char)' совершенно бессмысленно.'sizeof (char)' по определению всегда 1, поэтому вы можете опустить его для 'char', и если тип когда-либо изменится,' ... * sizeof (char) 'тоже не поможет, поскольку он явно повторяет тип. Почему не 'BUFFER_SIZE * sizeof (buffer [0])'? (И если этот буфер не распределяется динамически, 'sizeof (buffer) * sizeof (buffer [0])' тоже хорошо работает.) – sbi

0

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

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

Per Microsoft, правильной формы, чтобы вычислить, что вы хотите это:

SizeOf массив/SizeOf массив [0]

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

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

+0

Где-то в заголовке Windows есть макрос препроцессора с именем '_countof', который в основном расширяется до указанного выше. – dreamlax