【问题标题】:Buffer size: N*sizeof(type) or sizeof(var)? C++缓冲区大小:N*sizeof(type) 还是 sizeof(var)? C++
【发布时间】:2010-05-28 23:33:14
【问题描述】:

我刚从 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 等其他函数中看到了这一点。

【问题讨论】:

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


    【解决方案1】:

    都不对。

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

    【讨论】:

    • sizeof(char) 在 C 中总是返回 1,无论平台如何(即使实际大小更小,就像一个半字节)。
    • 我还应该注意,即使char 超过 8 位,sizeof(char) 也会返回 1。
    • TCHAR 数组的最后一个“sizeof(buffer)”是错误的!要么使用 _countof() 而不是 _sizeof(),要么使用 sizeof(buffer)/sizeof(TCHAR)。
    • 最后一个是StringCbPrintf。 size 参数以字节为单位。
    【解决方案2】:

    鉴于上述两个变体,第一个要好得多,因为它不会重复“神奇常数”255。如果您希望第二个变体与第一个竞争,您必须这样做

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

    【讨论】:

    • 这是否正确取决于函数想要什么。如果它想要 bytes 的数量,那是对的,如果它想要 objects 的数量,那就错了。但即使在后一种情况下,...*sizeof(char) 也毫无意义。 sizeof(char) 根据定义始终为 1,因此您可以为 char 省略它,如果类型要改变,...*sizeof(char) 也没有真正的帮助,因为它明确地重复了类型。为什么不BUFFER_SIZE*sizeof(buffer[0])? (如果该缓冲区不是动态分配的,sizeof(buffer)*sizeof(buffer[0]) 也可以很好地工作。)
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      根据 Microsoft,计算您想要的正确形式是:

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

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

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

      【讨论】:

      • 隐藏在 Windows 标头中的某处,有一个名为 _countof 的预处理器宏,它基本上扩展为上述内容。
      猜你喜欢
      • 2014-07-21
      • 1970-01-01
      • 2012-10-21
      • 1970-01-01
      • 2019-10-18
      • 1970-01-01
      • 2016-04-01
      • 2020-02-18
      • 1970-01-01
      相关资源
      最近更新 更多