C语言中结构体组成的联合体动态分配出错,声明方式是否正确?
问题修复说明
你当前的联合体声明方式不正确,代码存在三类核心语法/逻辑错误,具体如下:
错误详情
- 类型定义错误:你定义结构体、联合体时只创建了全局变量,没有声明可复用的类型
你写的
struct {...} dfp;属于匿名结构体定义,仅创建了名为dfp的全局变量,没有声明struct dfp类型,后续代码中所有struct dfp*的写法都会被编译器判定为未知类型。联合体也存在相同问题:union {...} quant;仅创建了全局变量quant,没有声明union quant类型,因此struct member中union quant arr的声明也会报错。 - 成员访问语法错误:
ptr->arr是联合体变量而非指针,访问内部成员应该用.运算符,你写的ptr->arr->df语法不成立。 - 数组访问逻辑错误:你申请的是
struct dfp/struct affine类型的数组,对应指针指向的是数组首元素,访问第i个元素的成员应该用df[i].fp的写法,你写的df->fp[i]会尝试把int类型的fp当成数组访问,直接触发类型错误。
修正后的可运行代码
#include <stdio.h> #include <stdlib.h> // 给结构体加标签,声明可用的结构体类型 struct dfp { int fp; }; struct affine { int scale; int zp; }; // 给联合体加标签,声明可用的联合体类型 union quant { struct dfp *df; struct affine *af; }; struct member { int total; union quant arr; }; int main(void) { struct member* 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 < ptr->total; i++) { // 修正数组元素访问逻辑 ptr->arr.df[i].fp = 10; } } else { ptr->arr.af = (struct affine*)malloc(ptr->total * sizeof(struct affine)); for(int i = 0; i < ptr->total; i++) { ptr->arr.af[i].scale = 10; ptr->arr.af[i].zp = 20; } } // 补充内存释放逻辑避免内存泄漏 if(!type) { free(ptr->arr.df); } else { free(ptr->arr.af); } free(ptr); return 0; }
内容的提问来源于stack exchange,提问作者Its me
相关产品推荐
相关产品推荐

