sdyxz123 2024-03-08 12:02 采纳率: 39%
浏览 10
已结题

如何动态的使用不同结构体数据

有2个结构体 一个A ,, 一个B,, 我要在初始化函数Func中,根据获取的 value值(value值动态的),生成 A 和 B,比如value =1 的是时候我需要A value = 2的时候需要B ,然后将其放到一个内存区域
在完成初始化后,我要在使用函数里的时候获取到了该片内存地址,如何判断是A还是B呢?
给出例子 C语言。专业优雅的代码 ,常用的方法有哪些,推荐怎么使用。

  • 写回答

24条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-08 12:02
    关注
    获得0.45元问题酬金

    引自免费微信小程序:皆我百晓生

    在C语言中,您可以使用联合体(union)或指向结构体的指针来动态地处理不同类型的结构体。这里以指针方法为例,给出一个解决方案:

    #include <stdio.h>
    #include <stdlib.h>
    
    // 定义结构体A和B
    typedef struct {
        int a;
        char name[20];
    } StructA;
    
    typedef struct {
        float b;
        double c;
    } StructB;
    
    // 定义一个通用的结构体指针类型
    typedef struct {
        int type; // 用于区分是A还是B
        void *data; // 指向实际结构体的指针
    } DynamicStruct;
    
    // 根据type生成对应的结构体并返回其指针
    void* create_struct(int value) {
        if (value == 1) {
            StructA *a = malloc(sizeof(StructA));
            // 初始化或其他操作...
            return (void*)a;
        } else if (value == 2) {
            StructB *b = malloc(sizeof(StructB));
            // 初始化或其他操作...
            return (void*)b;
        }
        return NULL; // 或抛出错误
    }
    
    // 使用结构体的函数Func
    void Func(DynamicStruct *ds) {
        switch(ds->type) {
            case 1:
                StructA *a = (StructA*)ds->data;
                // 对结构体A进行操作...
                printf("StructA: a = %d, name = %s\n", a->a, a->name);
                break;
            case 2:
                StructB *b = (StructB*)ds->data;
                // 对结构体B进行操作...
                printf("StructB: b = %.2f, c = %.2f\n", b->b, b->c);
                break;
            default:
                printf("Invalid type!\n");
                break;
        }
    
        // 使用完后释放内存
        free(ds->data);
    }
    
    int main() {
        DynamicStruct ds;
        ds.type = 1; // 假设我们需要创建StructA
    
        ds.data = create_struct(ds.type);
        if (ds.data != NULL) {
            Func(&ds);
        }
    
        return 0;
    }
    
    

    通过这种方式,您可以在Func函数中根据DynamicStruct中的type字段判断具体的数据类型,并通过类型转换访问相应的结构体成员。

    关于malloc生成的结构体与直接定义变量的区别:

    • malloc分配的是堆上的空间,需要手动通过free函数释放,生命周期更灵活,可以跨函数调用。
    • 直接定义的变量通常存储在栈上,其生命周期随着所在作用域结束而自动销毁。
    • 堆上分配的空间可以根据需求动态调整大小,不受编译时栈空间限制。
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 3月16日
  • 修改了问题 3月8日
  • 修改了问题 3月8日
  • 创建了问题 3月8日

悬赏问题

  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 关于大棚监测的pcb板设计
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用