繁体   English   中英

缓冲区大小:N * sizeof(type)或sizeof(var)? C ++

[英]Buffer size: N*sizeof(type) or sizeof(var)? C++

我刚刚开始使用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。

两者都不正确。

您正在使用StringCchPrintf(),它根据字符数而非字节进行操作。 sizeof(buffer)返回缓冲区的大小(以字节为单位),255 * sizeof(char)也是如此。 255 * sizeof(char)的缺点是你在两个地方复制数组的大小 - 如果你改变缓冲区的大小但忘记调用StringCchPrintf,你就有一个bug。

这恰好起作用,因为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);

鉴于以上两种变体,第一种变体要好得多,因为它不会重复“魔术常数”255.如果你想让第二种变体与第一变体竞争,你必须这样做

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

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(类型)以保持一致性并避免细微的错误。

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

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

sizeof array / sizeof数组[0]

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM