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) 还有一个缺点,就是你在两个地方复制了数组的大小——如果你改变了缓冲区的大小,但在调用 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

鉴于上述两个变体,第一个变体要好得多,因为它不会重复“魔术常数”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

您应该使用常量来表示大小,而不是像您那样使用整数。

根据 Microsoft,计算所需内容的正确形式是:

数组大小/数组大小[0]

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

此外, sizeof 并不完美,因为在某些情况下它会返回指针的大小而不是数组的大小。在这种情况下,术语 SIZE OF 有点误导,因为您必须问自己 - 我实际上得到了什么SIZE OF

于 2010-05-28T23:42:47.033 回答