如何在C中创建嵌套结构

时间:2018-11-19 02:56:12

标签: c struct

我已经开始学习C语言,并且发现创建复杂的数据结构非常具有挑战性!

这里是背景:

我在头文件struct中创建了foo.h,并将其内容公开:

struct frame {
     char *name;
     int width;
     int height;
     //other stuffs
}

extern const struct frame
     vid_1080p,
     vid_720p;

frame的实例是恒定的,可以从其他文件访问。 foo.c看起来像这样:

const struct frame vid_1080p = {
    .name                 = "1080p",
    .width                = 1920,
    .height               = 1080,
};
const struct frame vid_720p = {
    .name                 = "720p",
    .width                = 1280,
    .height               = 720,
};

我想在struct中创建另一个struct frame,该元素将在程序启动时进行计算,并可以在必要时进行修改。我不确定如何处理此问题,我在下面尝试过这种方法,但它不起作用。

我失败的方法:

我已经这样修改了foo.h

struct frame_calc {
     int ratio;
     //other stuffs
}

struct frame {
     char *name;
     int width;
     int height;
     //other stuffs
     struct frame_calc *calc;
}

foo.c也被修改:

 const struct frame vid_1080p = {
        .name                 = "1080p",
        .width                = 1920,
        .height               = 1080,
        .calc                 =  malloc(sizeof(struct frame_calc)) //compiler complains here
    };
    const struct frame 720p = {
        .name                 = "720p",
        .width                = 1280,
        .height               = 720,
        .calc                 =  malloc(sizeof(struct frame_calc))
    };

然后在程序开始时调用一次init(),并填充calc结构:

void init(void)
{
     vid_1080p.calc.ratio = vid_1080p.height / vid_1080p.width;
     vid_720p.calc.ratio  = vid_720p.height  / vid_720p.width;
}

这种方法给了我一些编译器错误。我也不确定如何适当地初始化我的嵌套结构。另一个问题是,我正在使用malloc,这意味着我需要在正确的位置释放它。我想避免这种情况。我确信那里的所有程序程序员都知道如何更好地解决这个问题!

最后一个问题,如何从其他C文件访问ratio实例的vid_1080p成员?我在想vid_1080p->frame->calc->ratio

希望我已经设法说明了我想做什么?如果不是这样,我将很感激关于如何在StackOverflow中更好地修改此问题的建设性批评,因为这是我的第一个问题!

1 个答案:

答案 0 :(得分:4)

您不需要malloc的成员calc,因为实际的实例已嵌入-它不是指针。

如果由于某种原因需要将其用作指针,则需要:

struct frame {
     ...
     struct frame_calc* calc;
}

访问权限为var.calc->ratio = something;

如果您尝试在创建后修改结构(通过init()),为什么结构const?您是否要通过使结构保留指针来解决const struct问题,而不必更改指针,但可以更改其指向的值?

我建议不要使用const结构:

struct frame vid_1080p {
    ...
}

然后,您的init函数可以执行vid_1080p.calc.ratio = vid_1080p.height / vid_1080p.width;,如果您确实要强制执行constness,则可以通过指向const结构的指针来访问这些结构。 const frame *p_1080p