结构初始化数组在C中为0,警告:初始化程序周围缺少大括号

时间:2016-12-09 00:08:03

标签: c initialization warnings

示例代码:

#include <stdio.h>

typedef struct
{
  unsigned int a,
  unsigned int b,
  unsigned int c
} user_struct;


int main()
{
  user_struct arr[5] = {0};    // gives warning on compilation
  return 0;
}

上面的代码在gcc5.4中给出了警告 以下是警告。

警告:初始化程序周围缺少大括号

我的理解是,如果我想将任何对象初始化为0,我可以等同于{0}。

如何在没有编译器警告的情况下将结构数组初始化为0?感谢。

3 个答案:

答案 0 :(得分:1)

您的代码唯一的问题是在每个struct元素之后需要使用分号;而不是,

    typedef struct
    {
        unsigned int a;
        unsigned int b;
        unsigned int c;
    } user_struct;

您的初始化正常:

user_struct arr[5] = {0};  // this should memset all array elements (here struct) to zero

警告(如果有)只是您初始化但从未在代码中使用过arr

答案 1 :(得分:1)

对于初学者来说,有一个错字。您忘记在结构的最后一个数据成员之后放置一个分号,并且您将使用逗号分隔声明符(即您必须在b和c之前删除类型说明符)或者将使用分号来分隔数据成员的声明。 / p>

typedef struct
{
  unsigned int a,
  unsigned int b,
  ^^^^^^^^^^^^
  unsigned int c
  ^^^^^^^^^^^^ ^^^
} user_struct;

例如你可以写

typedef struct
{
  unsigned int a;
  unsigned int b;
  unsigned int c;
} user_struct;

关于警告然后这个声明

user_struct arr[5] = {0};    

声明聚合的聚合,这是一组结构。假设使用大括号括起的列表初始化聚合。这使得聚合的初始化更加清晰。所以编译器希望你写

user_struct arr[5] = { { 0 } };

尽管如此,您的声明是正确的。

答案 2 :(得分:0)

最简单的方法是使用memset。您可以保证这将清除阵列和所有结构成员。见下面的例子:

memset(arr, 0, sizeof(arr));