【问题标题】:"Buffer too small" error on resized array (C++ / Win32)调整大小的数组 (C++ / Win32) 出现“缓冲区太小”错误
【发布时间】:2012-08-21 21:18:27
【问题描述】:

我正在调整数组的大小。调整大小(将大小加倍)似乎可以正常工作,但是当我将更多文本发送到调整大小的数组时,当它达到调整大小之前数组的限制时,我得到一个“调试断言失败!表达式: (L"缓冲区太小" && 0)" 错误。我尝试了几种不同的方法,总是得到相同的结果。

    static int ReadBufferSize, totalChars;    
    static char *ReadBuffer = NULL;
    ReadBuffer = (char *)malloc(ReadBufferSize);

    ...

    //Double buffer size.
    if((float)totalChars > (0.75f) * (float)ReadBufferSize)
    {
        char *tempBuffer = NULL;
        tempBuffer = (char *)malloc(2 * ReadBufferSize); 
        if(tempBuffer == NULL)
            free(tempBuffer);
        else
        {
            memcpy(tempBuffer,ReadBuffer,strlen(ReadBuffer)+1);
            free(ReadBuffer);
            ReadBuffer = tempBuffer;
            tempBuffer = NULL;
            ReadBufferSize *= 2;
        }
    }

对于我的测试,ReadBufferSize 最初设置为 85 个字符。在执行了调整数组大小的代码后,ReadBuffer 中的文本仍然显示在屏幕上。我输入更多字符,它们被发送到数组中,然后从那里显示在屏幕上。但是当字符数达到 85 个字符时,我收到“Debug Assertion Failed! Expression: (L"Buffer is too small" && 0)”错误,此时应该有 170 个字符的空间。我也尝试了以下方法。

//Double buffer size.
if((float)totalChars > (0.75f) * (float)ReadBufferSize)
{
    char* temp = 0;
    temp = new char[2 * ReadBufferSize];
    for(unsigned int i = 0; i < strlen(ReadBuffer); i++)
        temp[i] = ReadBuffer[i];
    temp[strlen(ReadBuffer)] = '\0';
    delete[] ReadBuffer;
    ReadBuffer = temp;
    temp = 0;
    ReadBufferSize *= 2;
}

我也试过了:

malloc(2 * ReadBufferSize * sizeof(char));

和:

strcpy_s(tempBuffer, strlen(ReadBuffer)+1, ReadBuffer);

非常感谢。

【问题讨论】:

  • 只需使用std::string。它是 C++ 而不是 C。你的代码中有太多错误和错误,试图纠正它是毫无意义的。
  • 这里通常的嫌疑人是strlen。您确定缓冲区中的字符串是正确的以零结尾的字符串吗?否则,对strlen 的调用将不会为您提供正确的值。

标签: c++ windows


【解决方案1】:

由于您没有提供完整的最小程序,因此很难说出哪里出了问题。 您通常应该在调试器中启动程序,在函数中放置断点并重现问题。查看所有变量和函数,例如 strlen()。它们可能会返回您不期望的值。

题外话,但对于实际应用程序,您最好使用 std::string 自动完成所有内存管理技巧。

【讨论】:

  • 我不会说你最后的建议是“离题”。它实际上是准确的,因为这可能会解决 OP 的许多问题。
  • 源缓冲区中的字符串以空值结尾。我的印象是 for(unsigned int i = 0; i &lt; strlen(ReadBuffer); i++) temp[i] = ReadBuffer[i]; 会复制除空终止符以外的所有字符,因为 strlen() 不计算空值。这样temp[strlen(ReadBuffer)] = '\0'; 然后 null 终止目标缓冲区。
  • 调试器中的一切似乎都很好,执行了扩大数组的代码,我可以看到字符被复制了等等。我没有办法检查实际大小操作后的数组,因为所有 sizeof() 给你的是指针的大小。
  • 我想通了。当我注意到问题时,我正要发布更多代码以向您提供更多信息。我有一个用于数组大小的“pageSize”变量。然后,当我想开始动态更改大小时,我通过创建“ReadBufferSize”变量将数组大小与页面大小分开。不幸的是,我在将字符放入数组的代码段中仍然有“pageSize”:strcat_s(ReadBuffer, pageSize, keystroke);
  • 我现在已将其更改为strcat_s(ReadBuffer, ReadBufferSize, keystroke);,一切似乎都正常。感谢大家花时间看这个。我一直认为问题一定出在调整数组大小的代码部分,而不是其他地方。
【解决方案2】:

我想通了。当我注意到问题时,我正要发布更多代码以向您提供更多信息。我有一个用于数组大小的“pageSize”变量。然后,当我想开始动态更改大小时,我通过创建“ReadBufferSize”变量将数组大小与页面大小分开。不幸的是,我在将字符放入数组的代码段中仍然有“pageSize”:

strcat_s(ReadBuffer, pageSize, keystroke);

我现在改成

strcat_s(ReadBuffer, ReadBufferSize, keystroke);

一切似乎都在工作。感谢大家花时间看这个。我一直认为问题一定出在调整数组大小的代码部分,而不是其他地方。

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 2016-02-22
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    • 2018-08-15
    相关资源
    最近更新 更多