我有以下结构:
struct lshort_sched_param {
int requested_time;
int level;
};
struct sched_param {
union {
int sched_priority;
struct lshort_sched_param lshort_params;
};
};
和我试图像这样创建一个新实例:
struct lshort_sched_param *l = {2 ,1};
struct sched_param *p = {3, l};
并得到一些警告:
test.c:5: warning: initialization makes pointer from integer without a cast
test.c:5: warning: excess elements in scalar initializer
test.c:5: warning: (near initialization for `l')
test.c:6: warning: initialization makes pointer from integer without a cast
test.c:6: warning: excess elements in scalar initializer
test.c:6: warning: (near initialization for `p')
任何人都可以帮我解决这个问题吗?
答案 0 :(得分:3)
这是不允许的:
struct lshort_sched_param *l = {2 ,1};
包含多个元素的括号封装初始化列表只能初始化struct
或数组,而不是指针。
你可以写:
struct lshort_sched_param m = { 2, 1 };
struct lshort_sched_param *ptr_m = &m; // optional
您还需要考虑m
的存储持续时间。 (注意:我使用m
代替l
作为变量名,因为后者在许多字体中看起来像1
。
另一种可能性是:
struct lshort_sched_param *ptr_m = (struct lshort_sched_param) { 2, 1 };
在这种情况下,您可以修改ptr_m
指向的对象。这称为复合文字。它具有自动存储持续时间("在堆栈上#34;)如果ptr_m
有;否则它有静态存储持续时间。
然而struct sched_param *p = {3, l};
的情况变得更糟。同样,初始化程序无法初始化指针。
另外,union初始化器只能有一个元素;它不允许尝试初始化一个以上的工会成员。无论如何,这没有任何意义。 (也许你误解了工会的运作方式)。
另一个可能的问题是文件范围的初始值设定项必须是常量表达式。
答案 1 :(得分:0)
你正在声明指针,但是在你尝试修改它们所指向的东西之前,它们必须指出一些东西,这可以用这样的malloc来完成。
struct lshort_sched_param *l = NULL;
l = malloc(sizeof(struct lshort_sched_param));
struct sched_param *p = NULL;
p = malloc(sizeof(struct sched_param));
我们在做什么?好吧,malloc在内存上分配一些字节并返回指向块开头的指针,在我们的例子中,我们将malloc返回的指针赋给我们的指针l和p,结果是现在l和p指向我们刚刚制造的结构。
然后你可以用这种方式改变p和l指向的结构的值。
l->requested_time = 2;
l->level = 1;
p->sched_priority = 3;
p->lshort_params.requested_time = 1;
p->lshort_params.level = 1;
修改强>
显然,你也可以这样做。
struct lshort_sched_param p = {2, 1};
然后。
struct lshort_sched_param *ptr = &p;
但是当你在做的时候。
struct lshort_sched_param *l;
你只是在宣布一个指针而已,而且在你向他提供变量的地址之前,它并没有指向任何东西。
答案 2 :(得分:0)
我认为您想要执行以下操作:
struct lshort_sched_param {
int requested_time;
int level;
};
union sched_param {
int sched_priority;
struct lshort_sched_param lshort_params;
};
要为struct / union分配内存,请执行以下操作:
struct lshort_sched_param l = {2 ,1};
union sched_param p;
// init
// either this
p.sched_priority = 3;
// or that
p.lshort_params = l;
您的第struct sched_param *p = {3, l};
行没有意义。