C中的指针问题,struct in struct和malloc
Problem in C with pointers, struct in struct and malloc
我在 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 有点长。
这是不起作用的地方
void CreateRadioButton(AssetRADIOBUTTON * Radio, lv_obj_t * tab, unsigned char RadioCount)
{
Radio = malloc(sizeof(*Radio) + RadioCount * sizeof(*Radio->btn));
您正在 Radio
中存储分配内存的地址,这是一个 局部变量 。当您调用 CreateRadioButton(Settings->Some.Radio1...)
时,您只是在传递一个指针,您甚至都不会查看其值。你需要做的是告诉你的函数指针在哪里,这样它就可以被修改。
因此,更改函数签名,使其接受指向指针的指针,并传递要更改的指针的地址:
void CreateRadioButton(AssetRADIOBUTTON ** Radio,lv_obj_t * tab,unsigned char RadioCount)
{
*Radio = malloc(sizeof(AssetRADIOBUTTON ) + RadioCount * sizeof(lv_obj_t));
(*Radio)->Widgetcount = RadioCount;
for(unsigned char i=0;i<RadioCount;i++)
(*Radio)->btn[i] = lv_checkbox_create(tab);
(*Radio)->index = 0;
}
...
CreateRadioButton(&Settings->Some.Radio1,Settings->ECG.tab,4);
注意使用 &
运算符获取 Radio1
指针的 地址,并在 CreateRadioButton
中使用*
运算符 取消引用 Radio
指向指针的指针,以获得指向 AssetRADIOBUTTON
.
的指针
如果此语法太麻烦,请考虑以下替代方法。
AssetRADIOBUTTON* p = *Radio;
p->Widgetcount = RadioCount;
for(unsigned char i=0;i<RadioCount;i++)
p->btn[i] = lv_checkbox_create(tab);
p->index = 0;
这会创建一个新变量,但对于任何体面的编译器,生成的代码都是相同的。
我在 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 有点长。
这是不起作用的地方
void CreateRadioButton(AssetRADIOBUTTON * Radio, lv_obj_t * tab, unsigned char RadioCount)
{
Radio = malloc(sizeof(*Radio) + RadioCount * sizeof(*Radio->btn));
您正在 Radio
中存储分配内存的地址,这是一个 局部变量 。当您调用 CreateRadioButton(Settings->Some.Radio1...)
时,您只是在传递一个指针,您甚至都不会查看其值。你需要做的是告诉你的函数指针在哪里,这样它就可以被修改。
因此,更改函数签名,使其接受指向指针的指针,并传递要更改的指针的地址:
void CreateRadioButton(AssetRADIOBUTTON ** Radio,lv_obj_t * tab,unsigned char RadioCount)
{
*Radio = malloc(sizeof(AssetRADIOBUTTON ) + RadioCount * sizeof(lv_obj_t));
(*Radio)->Widgetcount = RadioCount;
for(unsigned char i=0;i<RadioCount;i++)
(*Radio)->btn[i] = lv_checkbox_create(tab);
(*Radio)->index = 0;
}
...
CreateRadioButton(&Settings->Some.Radio1,Settings->ECG.tab,4);
注意使用 &
运算符获取 Radio1
指针的 地址,并在 CreateRadioButton
中使用*
运算符 取消引用 Radio
指向指针的指针,以获得指向 AssetRADIOBUTTON
.
如果此语法太麻烦,请考虑以下替代方法。
AssetRADIOBUTTON* p = *Radio;
p->Widgetcount = RadioCount;
for(unsigned char i=0;i<RadioCount;i++)
p->btn[i] = lv_checkbox_create(tab);
p->index = 0;
这会创建一个新变量,但对于任何体面的编译器,生成的代码都是相同的。