起因
C++课实验,将一个类str2中的字符串成员变量追加到str中的字符串。编译没有问题,运行时在中间卡住无法继续运行。
错误
HEAP CORRUPTION DETECTED: after Normal block (#163) at 0x00968BD8. CRT detected that the application wrote to memory after end of heap buffer.
应该是某个变量申请的内存不够,导致写入字符时越界。
代码
const char * MyString::append(const char * p)
{
if (p != NULL)
{
char * tmp = new char[m_len + strlen(p) + 1];
sprintf_s(tmp, strlen(tmp) + 1, "%s%s", m_pbuf, p); // 错误
m_pbuf = tmp;
m_len = strlen(m_pbuf);
}
return m_pbuf;
}
错因
尽管为tmp分配了内存,还未写入字符,strlen(tmp)为0。
解决方法
strlen(tmp) + 1
改为m_len + strlen(p) + 1
总结
strlen() 是一个函数,它用来计算指定字符串 str 的长度,但不包括结束字符(即 ‘\0’ 字符)。其原型如下面的代码所示:
size_t strlen(char const* str);
计算的是字符串中字符个数,不能计算所占空间。