【问题标题】:Problem in C with pointers, struct in struct and mallocC中的问题与指针,结构中的结构和malloc
【发布时间】: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-&gt;Some.Radio1 通过调用CreateRadioButton 保持不变。

标签: c pointers malloc


【解决方案1】:

这是不工作的地方

void CreateRadioButton(AssetRADIOBUTTON * Radio, lv_obj_t * tab, unsigned char RadioCount)
{
    Radio = malloc(sizeof(*Radio) + RadioCount * sizeof(*Radio->btn));

您将分配内存的地址存储在Radio,这是一个局部变量。当您调用CreateRadioButton(Settings-&gt;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);

注意使用&amp; 操作符来获取Radio1 指针的地址,并在CreateRadioButton 中使用* 操作符来取消引用 em> 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;

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

【讨论】:

  • 现在在这种情况下,如何访问 CreateRadioButton 中 Radio 结构的内容?它说'* Radio'是一个指针;你的意思是使用'->'吗?|
  • @vahidajal:将. 的实例替换为-&gt;。该错误告诉你如何修复它。
  • CreateRadioButton 中没有.。如您所见,所有这些都是-&gt;。这令人惊讶。
  • 请查看我的新编辑。箭头运算符 -&gt; 仍然是从指针访问结构成员的正确方法,但需要一个额外的 * 运算符才能将指向指针的指针解引用回简单指针。
  • 我使用了代码块,但它确实会抛出错误。在你自己说之前尝试了你最近所说的,但没有成功。
猜你喜欢
  • 2013-05-09
  • 2013-01-23
  • 2016-07-05
  • 2020-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多