【问题标题】:defining structure variable during declaration在声明期间定义结构变量
【发布时间】:2015-02-05 12:12:39
【问题描述】:

我一直在尝试 C 中的结构。

struct val{
    unsigned int a : 1 ;
}store[100] ;

现在我想将所有数组成员的值初始化为 1。也就是说,我希望所有数组成员的变量 a 分配给 1。我可以为此使用循环,但在此期间如何执行此操作声明?

struct val
{
    unsigned int a=1 : 1 ;
}store[100];

我怎样才能做到这一点?上面的语法在 code::blocks 中是错误的。

【问题讨论】:

  • 如果你在一个类中有这个,你可以在构造函数中初始化它,通过使用一个简单的 100 次运行并初始化每个元素
  • @MartinWalzl,他使用的是 C,而不是 C++
  • 它被标记为 C,而不是 C++。
  • 其实100是一个测试号,实际是9位数字。如您所见,我不能使用 for。
  • 哦,废话,对不起,我想我只是看多了....

标签: c structure declaration


【解决方案1】:
struct val
{
unsigned int a : 1;
}store[100];

我最初认为您所做的是位域初始化。 Further research though suggested I am wrong,并且您正在尝试使用 gcc 的 designated initializersWhat you want to do, is not possible that way. 我在你的代码中找到了另一种方法,你可以做到这一点:

typedef struct {
    unsigned int a;
} val;

然后,在你想要初始化数组的地方,你会做这样的事情:

val values[100] = {[0].a = 1};

这是通过利用 gcc 的这种行为来工作的:

如果同一个字段被多次初始化,它具有上次初始化的值。如果任何此类重写的初始化具有副作用,则未指定副作用是否发生。目前,GCC 会丢弃它们并发出警告。

我的测试程序如下:

#include <stdio.h>

struct val {
    unsigned int a;
};



int
main (void)
{
    struct val value[100] = {[0].a = 1};
    printf ("A random val's value is %d\n", value[40].a);
    return 0;
}

在我的 GCC 4.9.1 上编译和运行干净。

【讨论】:

  • 循环是一个很好的解决方案,但只适用于小数字。如果我想初始化代码中的每个数组成员,我将不得不运行十亿次循环。所以不能使用for循环。
  • @KapilGarg 我编辑了答案。查看更改是否反映了您想要实现的目标。
【解决方案2】:

这是不可能的。

您可以使用循环,或者,如果您想将 所有 结构的数据成员初始化为特定值,也可以使用 memset

struct val {
    unsigned int a : 1 ;
} store[N];

memset(store, value, N * sizeof(struct val));

【讨论】:

  • 好的,但是我们有什么unsigned int a : 10;memset()之后会发生什么?
  • 我认为这取决于所设置的值,但应以与在值中定义相同的方式设置适当的位。这使得它具有非零值的风险。除非你知道自己在做什么。
【解决方案3】:

在声明struct 变量之前,您不能初始化它的成员。初始化可以做为

struct val{
    unsigned int a : 1;
}store[100] = {[0].a = 1} ; // Designated initializer   

但它会将store的其他元素的a成员初始化为0。要初始化store 的所有元素的成员a,您需要一个循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多