我已经开始学习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中更好地修改此问题的建设性批评,因为这是我的第一个问题!
答案 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
。