结构联合的动态分配

Dynamic allocation of union of structs

我正在尝试创建 2 个结构(dfp 和仿射)的联合,并希望动态分配它们。我在 union 中创建特定结构数组时遇到错误。我是否以正确的方式声明联合?

#include <stdio.h>
#include <stdlib.h>

struct{
    int fp;
}dfp;

struct{
    int scale;
    int zp;
}affine;

union{
    struct dfp *df;
    struct affine *af;
}quant;

struct member{
    int total;
    union quant arr;
};

int main(void) {
    // your code goes here
    struct member* ptr;
    ptr = (struct member *)malloc(sizeof(struct member));
    
    
    ptr->total = 2;
    int type = 0;
    if(!type){
        ptr->arr->df = (struct dfp*)malloc(ptr->total*sizeof(struct dfp));   //error
        for(int i=0;i<2;i++){
            ptr->arr->df->fp[i] = 10;
        }
    }
    else{
        ptr->arr->af = (struct affine*)malloc(ptr->total*sizeof(struct affine));   //error
        for(int i=0;i<2;i++){
            ptr->arr->af->scale[i] = 10;
            ptr->arr->af->zp[i] = 20;
        }
    }
    return 0;
}

更正结构定义如下:

struct dfp {
    int fp;
};

struct affine{
    int scale;
    int zp;
};

大部分问题已经被其他人单独指出。这是我尝试写一个带有解释和建议的完整答案。

  • 首先,请检查您确切的编译器警告和错误。这些是您解决此类问题的最佳帮助。
  • 该程序不包含结构的联合,而是指向结构的指针的联合。
  • 程序的定义不正确。以dfp为例。这 struct { int fp; } dfp; 定义了一个 匿名结构 和变量名 dfp。结构的名称应该在结构声明列表之前,例如struct dfp { int fp; };。请参阅 here 或参阅 C 标准规范。
  • 根据main中的代码判断,结构的成员变量应该是大小为2的数组而不是单个ints。
  • 运算符->用于“使用指针访问成员”。由于 arr 不是指针,因此使用点 (.) 访问其成员。参见 here
  • 必须释放动态分配的内存,否则程序将发生一次或多次内存泄漏。

这里是包含所有提到的更正的完整代码:

#include <stdio.h>
#include <stdlib.h>

struct dfp {
    int fp[2];
};

struct affine {
    int scale[2];
    int zp[2];
};

union quant {
    struct dfp *df;
    struct affine *af;
};

struct member {
    int total;
    union quant arr;
};

int main(void) {
    struct member* ptr;
    ptr = (struct member *)malloc(sizeof(struct member));
    
    ptr->total = 2;
    int type = 0;
    if(!type) {
        ptr->arr.df = (struct dfp*)malloc(ptr->total*sizeof(struct dfp));
        for(int i=0;i<2;i++){
            ptr->arr.df->fp[i] = 10;
        }
    }
    else {
        ptr->arr.af = (struct affine*)malloc(ptr->total*sizeof(struct affine));
        for(int i=0;i<2;i++){
            ptr->arr.af->scale[i] = 10;
            ptr->arr.af->zp[i] = 20;
        }
    }

    if(!type) {
        free(ptr->arr.df);
    }
    else {
        free(ptr->arr.af);
    }
    free(ptr);
}