我正在STM32芯片上运行一些代码,该芯片正在登录到我的uart端口。
我很难找到记录字节数组的正确方法。我写了这个函数:
static void LogBytes(uint8_t *data, uint32_t length)
{
char message[length*6]={};
static char byteRepresentation[6];
for (uint32_t i=0; i<length; i++)
{
sprintf(byteRepresentation, "0x%02X ", data[i] & 0xFF);
strncat(message, byteRepresentation, 6);
}
logger.WriteDebug(LoggingCategorySio, message);
}
但当我运行这个程序时,我最终会遇到硬故障(这是一个很难解决的问题,但我怀疑这是由堆损坏/碎片化引起的(。
我认为问题是由strncat
引起的(对这个答案的评论警告了我可能遇到的一些问题(。我也阅读尽可能远离malloc/free。因此,我正在努力在堆栈上尽我所能。
我是不是在这段代码中遗漏了一些愚蠢的错误?还是应该完全不同?
来自评论:
"还有其他更快、更高效的替代方案(例如strcpy((或memmove(((。差不多无论"我应该使用什么"的问题是什么,strncat((都不是回答";
使用strcpy/memmove确实更好吗?或者他们实际上更依赖malloc/free,因此我应该更多地避免这种情况吗?
如果问题最终是由于堆过度使用(来自strncat
(,那么您可以尝试这个实现,它使用sprintf
的返回来在构建字符串时附加到字符串。
static void LogBytes(uint8_t *data, uint32_t length)
{
char message[length*6];
memset(message, 0, length*6);
size_t message_offset = 0;
for (uint32_t i=0; i<length; i++)
{
int ret = sprintf(message + message_offset, "0x%02X ", data[i] & 0xFF);
if (ret > 0){
message_offset += ret;
} else {
//TODO react however you want to sprintf error
break;
}
}
logger.WriteDebug(LoggingCategorySio, message);
}
然而,也可能存在堆栈溢出的问题。如果这就是问题所在,那么这个可变长度数组char message[length*6];
可能是打印超大数组时发生硬故障的罪魁祸首。