记一次C++中关于strlen()的错误

起因

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);

计算的是字符串中字符个数,不能计算所占空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值