我有一个函数为char* c
变量分配内存,然后释放它。调试时出现错误:
---------------------------
Microsoft Visual C++ Runtime Library
---------------------------
Debug Error!
HEAP CORRUPTION DETECTED: after Normal block (#95) at 0x0130BE00.
CRT detected that the application wrote to memory after end of heap buffer.
我做错了什么?
void logHex(char* value, int len, int level)
{
if (LogHnd)
{
char* c = (char*)calloc(len * 3, 1);
for (int i = 0; i < len; i++)
{
sprintf(c, "%s%02X ",c,value[i]);
}
LogHnd(c, level);
free(c);
}
}
在sprintf
中使用相同的指针作为源和目标会导致未定义行为
在c++中使用std::string
来满足所有字符串的需要,然后你可以使用普通的+
操作符来附加字符串。
要格式化字符串,请使用std::ostringstream
,格式库或std::format
(如果您的编译器足够新)。
使用std::ostringstream
,可以是这样的:
std::string c;
for (int i = 0; i < len; ++i)
{
c += (std::ostringstream{} << std::hex << std::setw(2) << std::setfill('0') << static_cast<unsigned>(value[i])).str();
}
使用std::format
可以是这样的:
std::string c;
for (int i = 0; i < len; ++i)
{
c += std::format("{:02x}", static_cast<unsigned>(value[i]));
}
与格式库相同,但使用fmt
命名空间而不是std
。
注意,我将value[i]
中的char
值转换为unsigned
整数,因为如果char
是有符号的或无符号的,它是实现定义的。如果char
是有符号的,那么0x7f
以上的值将被认为是负的,并导致符号扩展,这将在值中添加许多f
的十六进制数字。