我正在调整数组大小。调整大小(大小加倍)似乎正常工作,但是当我向调整大小的数组发送更多文本时,当它在调整大小之前达到数组的限制时,我得到一个“调试断言失败!表达式: (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个字符时,我得到“调试断言失败!表达式:(L”缓冲区太小“&& 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);
非常感谢。
答案 0 :(得分:3)
由于您没有提供完整的最小程序,因此很难说出错了什么。 您通常应该在调试器中启动程序,在您的函数中放置断点并重现问题。看看所有变量和函数,如strlen()。他们可能会返回您不期望的值。
Offtopic,但是对于真正的应用程序,你应该更好地使用std :: string,它会自动执行内存管理的所有技巧。
答案 1 :(得分:1)
我明白了。当我发现问题时,我正准备发布更多代码以便为您提供更多信息。我有一个“pageSize”变量,我一直用于数组的大小。然后当我想开始动态改变大小时,我通过创建“ReadBufferSize”变量将数组大小与页面大小分开。不幸的是,我在代码片段中仍然有“pageSize”,我将字符放入数组:
strcat_s(ReadBuffer, pageSize, keystroke);
我现在已将其更改为
strcat_s(ReadBuffer, ReadBufferSize, keystroke);
一切似乎都在起作用。感谢大家花时间看这个。我一直认为问题必须出在代码部分,以便调整数组大小,而不是其他地方。