【问题标题】:Array of struct initialization to 0 in C, warning: missing braces around initializer [duplicate]C中的结构初始化数组为0,警告:初始化器周围缺少大括号[重复]
【发布时间】:2016-12-09 00:08:02
【问题描述】:

示例代码:

#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分配给一个结构,你需要分配给每个结构成员。
  • 试试= {{0, 0, 0}}
  • 试试{{0}}。另外你在user_struct 中有错字。
  • user_stuct arr[5] = { { 0 } }; — 外大括号将数组初始化为一个整体,内大括号将数组的元素 0 初始化为粗略的近似值。在您的结构定义中,您需要在成员定义的末尾使用分号而不是逗号(或什么都没有)。你应该复制'n'paste以避免在SO问题中出现这样的错别字。
  • 我应该剪切+粘贴但在 SO 上键入代码。很抱歉。

标签: c initialization warnings


【解决方案1】:

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

    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

【讨论】:

  • 感谢您的链接。引用 AntT 的回答 You can use a simple { 0 } and it will work. 而实际上当我使用单括号时,gcc 并没有给出任何警告 -g -std=c11 -pedantic-errors -Wall -Wextra
  • 首先,这是一个代码 sn-p 并且想了解为什么它在执行 user_struct arr[5] = {0}; 时给出“警告:初始化器周围缺少大括号”;
  • { 0 } 表示法有其历史(和实际)先例。一些版本的 GCC 对此有所抱怨;其他人没有。奇怪的是,artm 和 Suresh 都有 GCC 5.4,但它们却得到了不同的结果。 FWIW:带有选项gcc -O3 -g -std=c11 -Wall -Wextra -Werror … 的GCC 6.2.0 在清理源(修复结构定义中的拼写错误)仅给出未使用的变量警告,而不是缺少大括号警告(即使添加了-Wmissing-braces)。我也从 GCC 5.2.0、5.3.0、6.1.0 得到相同的结果。更改为 user_struct arr[5] = {0, 0, 0}; 会收到警告。
  • 令人费解的是,Suresh 在 5.4 中看到了警告,而您却没有,而且我在周边版本中也没有看到。我很想知道 Suresh 是否真的使用 4.5 而不是 5.4,或者类似的东西,仅仅是因为你我发现了什么(不是我确定问题出现在 GCC 4.5 中;我没有副本已编译并准备就绪——我想知道版本号是否准确报告)。 […脑电波——哈哈;安装了 GCC 4.5.1 和 4.7.1 的机器!...] 使用 GCC 4.5.1 和 4.7.1,我收到来自隐式 -Wmissing-braces 的警告(使用 -std=c99;还没有 C11)。
【解决方案2】:

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

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 } };

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多