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

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来将各个数组的内容复制到目标数组中,这种方式天然支持可扩展(只需要调整数组长度定义即可)。

步骤说明

  1. 用宏定义长度:把所有数组长度用宏声明,未来修改时只需调整宏值,增强可扩展性
  2. 初始化目标数组:明确总长度的数组空间
  3. 设置固定值:给数组前两个字节赋值
  4. 调用外部函数获取数据
  5. 批量拷贝内容:按顺序将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 19:16:10