结构联合的动态分配
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的数组而不是单个int
s。
- 运算符
->
用于“使用指针访问成员”。由于 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);
}
我正在尝试创建 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的数组而不是单个int
s。 - 运算符
->
用于“使用指针访问成员”。由于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);
}