You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 18:15:08