【发布时间】:2021-11-22 10:36:54
【问题描述】:
我在 C 和 LVGL 中的内存分配存在问题。第一部分是定义。
typedef struct
{
unsigned char Widgetcount;
unsigned char index;
lv_obj_t * btn[];
}AssetRADIOBUTTON;
typedef struct{
lv_obj_t * tab;
AssetRADIOBUTTON * Radio1;
}AssetSettingsSome;
typedef struct{
lv_obj_t * ScreenMenuModule;
unsinged char radioCOUNT;
AssetSettingsSome Some;
}GUI_STRUCT_MODULES;
现在进行初始化,如果我在子函数中调用内存分配,它有效,在具有当前代码的子子函数中,它不起作用。 有效的代码:
void CreateRadioButton(AssetRADIOBUTTON * Radio,lv_obj_t * tab,unsigned char RadioCount)
{
Radio->Widgetcount = RadioCount;
for(unsigned char i=0;i<RadioCount;i++)
Radio->btn[i] = lv_checkbox_create(tab);
Radio->index = 0;
}
void CreateDialog(GUI_STRUCT_MODULES * Settings)
{
Settings->radioCOUNT = 4;
Settings->Some.Radio1 = malloc(sizeof(*Settings->Some.Radio1) + Settings->radioCOUNT * sizeof(*Settings->Some.Radio1->btn));
CreateRadioButton(Settings->Some.Radio1,Settings->ECG.tab,4);
}
void main(void)
{
static GUI_STRUCT_MODULES GUI_MODULES;
CreateDialog(&GUI_MODULES);
}
无效的代码
void CreateRadioButton(AssetRADIOBUTTON * Radio,lv_obj_t * tab,unsigned char RadioCount)
{
Radio = malloc(sizeof(*Radio) + RadioCount * sizeof(*Radio->btn));
Radio->Widgetcount = RadioCount;
for(unsigned char i=0;i<RadioCount;i++)
Radio->btn[i] = lv_checkbox_create(tab);
Radio->index = 0;
}
void CreateDialog(GUI_STRUCT_MODULES * Settings)
{
CreateRadioButton(Settings->Some.Radio1,Settings->ECG.tab,4);
}
void main(void)
{
static GUI_STRUCT_MODULES GUI_MODULES;
CreateDialog(&GUI_MODULES);
}
抱歉,MVP 有点长。
【问题讨论】:
-
C 是传值;
CreateRadioButton中的参数Radio是一个局部变量,分配给它对函数之外的任何内容都没有影响。所以CreateRadioButton的作用是分配一些内存,向其中写入一些东西,然后泄漏它,而CreateDialog看到Settings->Some.Radio1通过调用CreateRadioButton保持不变。