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

标签 c++ visual-c++ buffer sizeof buffering

我刚开始使用 cpp,我一直在关注不同的示例以从中学习,我看到缓冲区大小以不同的方式设置,例如:

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

对比

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

正确的使用方法是什么?

我在 InternetReadFile、ZeroMemory 和 MultiByteToWideChar 等其他函数中看到过这种情况。

最佳答案

两者都不正确。

您正在使用 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);

关于c++ - 缓冲区大小 : N*sizeof(type) or sizeof(var)? C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2933124/

相关文章:

c++ - 进程间通信 - 二进制数据/序列化对象

windows - 创建新进程后是否需要使用 CloseHandle?

caching - Postgres 是否提供刷新缓冲区缓存的命令?

C & Libevent : add binary data to output buffer

c++ - 区分指针和数据变量

c++ - 为什么我不能运行具有特定文件名的 exe?

c++ - 通过 C++ 的编译时安全更改 QML 属性

c++ - msvc预编译头警告抑制

android - 我可以通过 Visual C++ 将 C++ 中的空项目转换为 Android 应用程序吗?

caching - 为什么我们在 mips 中使用写缓冲区?[缓存]