1

私は 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 に答える 4

4

どちらも正しくありません。

バイト数ではなく文字数で動作する StringCchPrintf() を使用しています。sizeof(buffer) は、255*sizeof(char) と同様に、バッファのサイズをバイト単位で返します。255*sizeof(char) には、配列のサイズが 2 つの場所で重複しているという欠点もあります。バッファのサイズを変更しても 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);
于 2010-05-28T23:38:52.247 に答える
0

上記の 2 つのバリアントを考えると、「魔法の定数」 255 を繰り返さないため、最初のバリアントの方がはるかに優れています。

const size_t BUFFER_SIZE = 255;
char buffer[BUFFER_SIZE];
StringCchPrintf(buf, BUFFER_SIZE*sizeof(char), TEXT("%s"), X);
于 2010-05-28T23:37:48.707 に答える
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(type) を使用することをお勧めします。

于 2010-05-28T23:42:06.530 に答える
0

サイズには、整数ではなく定数を使用する必要があります。

マイクロソフトによると、必要なものを計算するための正しい形式は次のとおりです。

配列のサイズ / 配列のサイズ[0]

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

また、場合によっては配列のサイズではなくポインターのサイズを返すため、sizeof は完全ではありません。この場合、 SIZE OF という用語は少し誤解を招く可能性があります。なぜなら、実際にSIZE OFをどのように取得しているのかを自問する必要があるからです。

于 2010-05-28T23:42:47.033 に答える