结构中的联合。编译警告。 C

时间:2014-11-30 20:11:35

标签: c struct compiler-warnings unions

我有以下结构:

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')

任何人都可以帮我解决这个问题吗?

3 个答案:

答案 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};行没有意义。