uint8_t数组遇0x00数据被截断,使用memcpy无效如何解决?
问题根因
- 初始的
uint8_t* Buffer = temp_uint8_array;仅将指针指向原数组的首地址,没有执行任何内存复制操作,两个指针指向同一块内存空间。 - 观测到的“数据截断”本质是误用了面向字符串的处理/打印函数(例如
printf("%s")、strlen()等),这类函数以0x00作为终止标记,无法正确处理包含0x00的二进制数据,并非数据真的丢失。 - memcpy调用无效的核心原因:
- 未提前为
Buffer分配大小不小于local_length的独立内存空间,若Buffer仍指向原数组地址,memcpy等价于同一块内存的自复制,没有实际意义。 - 源地址参数写法不规范:数组名
temp_uint8_array本身就是首地址,不需要额外加取址符&。
- 未提前为
可行解决方案
步骤1:为Buffer分配独立内存
如果Buffer未提前分配空间,需要先申请足够的内存:
// 假设local_length已正确赋值为待复制的数组长度,示例中数组长度为6 size_t local_length = sizeof(temp_uint8_array) / sizeof(uint8_t); uint8_t *Buffer = (uint8_t *)malloc(local_length * sizeof(uint8_t)); if (Buffer == NULL) { // 内存分配失败的异常处理逻辑 perror("malloc failed"); return; }
如果Buffer是外部传入的已分配好的缓冲区,可跳过此步骤,仅需确保缓冲区大小≥local_length即可。
步骤2:执行正确的内存复制
memcpy(Buffer, temp_uint8_array, local_length);
步骤3:正确验证二进制数据
不要使用字符串类函数打印,按字节遍历输出即可看到完整数据:
for (size_t i = 0; i < local_length; i++) { printf("%02X ", Buffer[i]); } // 输出结果为:15 25 32 00 52 FD
注意事项
malloc申请的内存使用完成后,需要调用free(Buffer)释放,避免内存泄漏。- 如果是栈上分配Buffer,也可以直接定义固定长度的数组,比如
uint8_t Buffer[6];,再执行memcpy操作。
内容的提问来源于stack exchange,提问作者Clément
相关产品推荐
相关产品推荐

