首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C中有指针的问题,struct中的结构和malloc中的结构

C中有指针的问题,struct中的结构和malloc中的结构
EN

Stack Overflow用户
提问于 2021-09-30 15:12:08
回答 1查看 129关注 0票数 1

我在C和LVGL中的内存分配有问题。第一部分是定义。

代码语言:javascript
复制
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;

现在,对于初始化,如果我调用子函数中的内存分配(这是工作的),在带有当前代码的子函数中,它不能工作。有效的代码:

代码语言:javascript
复制
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);
}

不工作的代码

代码语言:javascript
复制
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太长了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-30 15:33:05

以下是不起作用的东西

代码语言:javascript
复制
void CreateRadioButton(AssetRADIOBUTTON * Radio, lv_obj_t * tab, unsigned char RadioCount)
{
    Radio = malloc(sizeof(*Radio) + RadioCount * sizeof(*Radio->btn));

您将分配内存的地址存储在Radio中,这是一个局部变量。当您调用CreateRadioButton(Settings->Some.Radio1...)时,您只是传递一个指针,它的值您甚至都不看。你需要做的是告诉你的函数指针在哪里,这样就可以修改它了。

因此,请更改函数签名,以便它获取指向指针的指针,并传递要更改的指针的地址:

代码语言:javascript
复制
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的指针。

如果这个语法太麻烦,请考虑以下选择。

代码语言:javascript
复制
    AssetRADIOBUTTON* p = *Radio;
    p->Widgetcount = RadioCount;
    for(unsigned char i=0;i<RadioCount;i++)
        p->btn[i] = lv_checkbox_create(tab);
    p->index = 0;

这将创建一个新变量,但是对于任何合适的编译器,生成的代码都将是相同的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69394707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档