c - C中的问题与指针,结构和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# - 比较不同类型的装箱值
- c++ - 智能指针(唯一指针)和引用
- visual-studio - 如何在 Visual Studio 中启用热插拔
- testing - 使用 Cucumberish 在 XCUITest 设置中重置应用程序
- python - 无法更改从 nodeJS 到 Python 的 spawn 发送的整数
- java - 在 ExtentReport 中打印屏幕截图
- c++ - 如何使用带有 Qt 和 C++ 的“接口类”来通信两个线程
- reactjs - 动态添加/删除输入 ReactJS
- sql - SQL 检索“日历”表
- c# - 异步并行循环返回任务之外太快,除非我在循环中检查完整的布尔值