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

C语言中如何借助void*实现多类型push_back函数的代码复用?

如何借助void*实现多类型通用的push_back函数

问题背景

现有如下C语言代码:

int* push_back_int(intVector* target, int push)
{
    target->length++;
    target->val = (int *)realloc(target->val, target->length * sizeof(int));
    target->val[target->length - 1] = push;
    return &target->val[target->length - 1];
}
float* push_back_float(floatVector* target, float push)
{
    target->length++;
    target->val = (float *)realloc(target->val, target->length * sizeof(float));
    target->val[target->length - 1] = push;
    return &target->val[target->length - 1];
}

请问是否可以用某个变量替代(int*)或(float*)的强制类型转换,从而借助void*实现多类型复用的通用代码?


解决方案

完全可以实现。核心是用void*作为通用数据指针,配合元素大小参数来管理不同类型的数组,彻底消除重复代码。

1. 定义通用动态数组结构体

把原来的intVector/floatVector替换成通用结构体,统一记录数据指针、当前长度和单个元素的字节大小:

typedef struct {
    void* val;         // 通用指针存储任意类型数据
    size_t length;     // 当前数组的元素个数
    size_t elem_size;  // 单个元素的字节大小
} GenericVector;

2. 实现通用push_back函数

不再针对特定类型写强制转换,而是通过字节级的指针运算和内存复制完成操作:

void* push_back_generic(GenericVector* target, const void* push_val)
{
    // 扩容:计算新内存大小并重新分配
    void* new_mem = realloc(target->val, (target->length + 1) * target->elem_size);
    if (!new_mem) return NULL; // 内存分配失败,直接返回NULL

    target->val = new_mem;
    // 计算新元素的存储地址(用char*做偏移,确保字节级精确)
    char* dest_addr = (char*)target->val + target->length * target->elem_size;
    // 复制传入的元素值到目标地址
    memcpy(dest_addr, push_val, target->elem_size);

    target->length++;
    return dest_addr; // 返回新元素地址,调用时可转成对应类型指针
}

3. 使用示例

调用时只需初始化对应类型的通用数组,传入元素的地址即可:

// 操作int类型数组
GenericVector int_vec = {NULL, 0, sizeof(int)};
int int_val = 100;
int* new_int = (int*)push_back_generic(&int_vec, &int_val);

// 操作float类型数组
GenericVector float_vec = {NULL, 0, sizeof(float)};
float float_val = 2.718f;
float* new_float = (float*)push_back_generic(&float_vec, &float_val);

关键说明

  • 这里不需要用变量替代强制类型转换,而是通过char*的精确偏移和memcpy绕开了针对特定类型的强转需求,只有在调用通用函数获取返回值时,才需要一次类型转换(这是C语言中void*转具体类型的必要步骤)。
  • 通用函数通过elem_size参数适配不同类型的内存需求,真正实现了多类型复用,无需为每种类型编写重复逻辑。

内容的提问来源于stack exchange,提问作者Daniel Thirtle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:54:22