示例代码:
#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?感谢。
答案 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));