C语言中通过接口指针传数组并构建目标数组的技术问询
问题:C语言构建16字节数组的正确实现方式
需求描述
需要构建一个16字节的数组:
- 前两个字节是固定值
0x01和0x10 - 剩余14字节通过外部函数
GetValues(uint8* index, uint8* ID, uint8* buffer)获取,其中index占2字节、ID占2字节、buffer占10字节 - 实现需具备可扩展性,不能手动逐个赋值(未来可能处理更大数组)
错误代码分析
当前代码直接将指针放入数组,这是错误的——C语言中数组初始化时放指针,实际存储的是指针的地址值,而不是指针指向的数组内容:
uint8 index[2]; uint8 ID[2]; uint8 buffer[10]; GetValues(index, ID, buffer); // 错误:这里把buffer、index、ID的指针地址存入数组,而非它们的内容 uint8 FinalArray[] = {0x01, 0x10, buffer, index, ID};
正确实现方案
要解决这个问题,需要用内存拷贝函数memcpy来将各个数组的内容复制到目标数组中,这种方式天然支持可扩展(只需要调整数组长度定义即可)。
步骤说明
- 用宏定义长度:把所有数组长度用宏声明,未来修改时只需调整宏值,增强可扩展性
- 初始化目标数组:明确总长度的数组空间
- 设置固定值:给数组前两个字节赋值
- 调用外部函数获取数据
- 批量拷贝内容:按顺序将
buffer、index、ID的内容复制到目标数组的对应位置
示例代码
#include <string.h> // 引入memcpy所需的头文件 // 宏定义所有长度,未来调整大小仅需修改此处 #define FIXED_LEN 2 #define BUFFER_LEN 10 #define INDEX_LEN 2 #define ID_LEN 2 #define FINAL_ARRAY_LEN (FIXED_LEN + BUFFER_LEN + INDEX_LEN + ID_LEN) // 总长度16字节 int main() { uint8 index[INDEX_LEN]; uint8 ID[ID_LEN]; uint8 buffer[BUFFER_LEN]; // 调用外部函数获取数据 GetValues(index, ID, buffer); // 初始化目标数组 uint8 FinalArray[FINAL_ARRAY_LEN]; // 设置前两个固定字节 FinalArray[0] = 0x01; FinalArray[1] = 0x10; // 按顺序拷贝各部分内容 memcpy(FinalArray + FIXED_LEN, buffer, BUFFER_LEN); memcpy(FinalArray + FIXED_LEN + BUFFER_LEN, index, INDEX_LEN); memcpy(FinalArray + FIXED_LEN + BUFFER_LEN + INDEX_LEN, ID, ID_LEN); // 后续可正常使用FinalArray return 0; }
关键说明
memcpy是C标准库的批量内存拷贝函数,能高效复制数组内容,避免手动逐个赋值的冗余代码- 宏定义长度的方式让代码具备可扩展性:比如未来如果
buffer需要改成20字节,只需要修改BUFFER_LEN的值,拷贝逻辑无需改动 FinalArray + offset等价于&FinalArray[offset],表示从目标数组的第offset个字节开始写入数据
内容的提问来源于stack exchange,提问作者Ciuboss
相关产品推荐
相关产品推荐

