C++使用strncpy复制缓冲区时报char**转char*错误如何解决
错误成因
- 形参声明错误:你写的
char* outBuffer[256]在C/C++函数形参中会被自动退化为char**类型,代表指向字符指针的指针,而标准库函数strncpy的第一个入参要求是目标字符串的首地址,类型为char*,二者类型不匹配,因此抛出类型转换错误。 - 隐藏逻辑问题:即使修正形参类型,直接使用
sizeof(outBuffer)获取长度的写法也存在问题,作为形参的数组会退化为指针,sizeof(outBuffer)得到的是系统指针的大小(32位系统为4字节,64位系统为8字节),并非你预期的256字节缓冲区长度。 - 潜在溢出风险:
strncpy在源字符串长度大于等于指定复制长度时,不会自动在目标字符串末尾添加\0终止符,容易引发后续字符串操作的越界问题。
正确实现方案
方案1:固定长度缓冲区(适合确定输出缓冲区固定为256字节的场景)
修正形参声明去掉多余的*,同时手动补充字符串终止符,实现代码如下:
void writeSensorStatus(SensorStatus& data, char outBuffer[256]) { // create temporary buffer char buffer[256]; const size_t capacity = JSON_OBJECT_SIZE(3); StaticJsonDocument<capacity> doc; serializeJson(data, buffer); strncpy(outBuffer, buffer, 256); // 手动补终止符,避免字符串无结束符导致溢出 outBuffer[255] = '\0'; }
方案2:动态传入缓冲区长度(更通用安全的写法)
把缓冲区长度作为参数传入函数,避免硬编码长度,可适配不同规格的输出缓冲区:
void writeSensorStatus(SensorStatus& data, char* outBuffer, size_t bufferSize) { // create temporary buffer char buffer[256]; const size_t capacity = JSON_OBJECT_SIZE(3); StaticJsonDocument<capacity> doc; serializeJson(data, buffer); // 取两个缓冲区的较小值作为复制长度,避免溢出 size_t copyLen = (bufferSize < sizeof(buffer)) ? bufferSize : sizeof(buffer); strncpy(outBuffer, buffer, copyLen); outBuffer[copyLen - 1] = '\0'; }
调用示例:
char outBuf[256]; writeSensorStatus(sensorData, outBuf, sizeof(outBuf));
内容的提问来源于stack exchange,提问作者Johnny boy
相关产品推荐
相关产品推荐

