C 如何在声明时初始化字符数组

C 如何在声明时初始化字符数组,c,gcc,C,Gcc,这两种方法等效吗 char a[10] = ""; char a[10] = { 0 }; 另外,我想声明初始化结构,但这在gcc中不起作用: struct c { char d[10]; int e; }; struct c f = { 0 }; a、 c:在函数“main”中: a、 c:33:警告:初始值设定项周围缺少大括号 a、 c:33:警告:(接近“f.d”的初始化) a、 c:33:警告:缺少初始值设定项 a、 c:33:警告:(接近“f.e”的初始化) a、

这两种方法等效吗

char a[10] = "";
char a[10] = { 0 };
另外,我想声明初始化结构,但这在gcc中不起作用:

struct c
{
    char d[10];
    int e; 
};
struct c f = { 0 };
a、 c:在函数“main”中:
a、 c:33:警告:初始值设定项周围缺少大括号
a、 c:33:警告:(接近“f.d”的初始化)
a、 c:33:警告:缺少初始值设定项
a、 c:33:警告:(接近“f.e”的初始化)
a、 c:33:警告:未使用的变量“f”是的,它们是等效的。 2) 试一试

您必须初始化这两个值。我记得也有问题,你可以试试

struct c f = (struct c){ "", 0 }
如果它不起作用


请参见。

是的,两个char[]初始化是相同的-都将初始化数组以包含零

对于结构问题,请尝试:

struct c f = { {0}, 0 };
(对于支持C99的较新版本的gcc,您也可以)

  • 是的,它们是等价的

  • 在“默认选项”下,结构初始化编译时不会发出警告。如果将编译器设置为fusy,则需要提供一个字符串(第一个问题中的两种形式之一)和一个整数:

    struct c
    {
        char d[10];
        int e; 
    };
    struct c f = { "", 0 };
    struct c g = { { 0 }, 0 };
    

  • “挑剔”是什么意思:

    Osiris-2 JL: cat x.c
    struct c
    {
        char d[10];
        int e; 
    };
    struct c f = { 0 };
    Osiris-2 JL: gcc -c x.c
    Osiris-2 JL: gcc -Wall -c x.c
    x.c:6: warning: missing braces around initializer
    x.c:6: warning: (near initialization for ‘f.d’)
    Osiris-2 JL: gcc -O -Wall -c x.c
    x.c:6: warning: missing braces around initializer
    x.c:6: warning: (near initialization for ‘f.d’)
    Osiris-2 JL: gcc -O -Wextra -Wall -c x.c
    x.c:6: warning: missing braces around initializer
    x.c:6: warning: (near initialization for ‘f.d’)
    x.c:6: warning: missing initializer
    x.c:6: warning: (near initialization for ‘f.e’)
    Osiris-2 JL: 
    
    在这种情况下,GCC“set-fusy”意味着添加诸如“-Wall”和“-Wextra”之类的选项,以获得比GCC编译到的C标准所要求的更多的警告。因为我没有指定哪个标准,所以它是按照GNU-99标准工作的(
    -std=gnu99


    要从问题中获取“unused variable”消息,我必须将变量f转换为静态变量。

    是的,前两个初始化是等效的

    第二次初始化将在GCC中工作。你的代码完全正确。在C语言中,
    {0}
    是一个通用的零初始值设定项,几乎可以用于任何类型。这是一个由来已久的成语。您从GCC得到的只是警告,是由某个人提出的,他做出了一个相当愚蠢的决定,要干扰通用零初始值设定项的功能


    [rant]GCC最近在某些方面已经走下坡路。[/rant]我理解他们的一般意图,但是具体的
    {0}
    表单应该被当作一个无警告的例外处理。

    使用GCC-Wall启用所有警告,在MSVC中,它在其中一个选项中的警告级别为4,不需要“初始化两个值”。
    Osiris-2 JL: cat x.c
    struct c
    {
        char d[10];
        int e; 
    };
    struct c f = { 0 };
    Osiris-2 JL: gcc -c x.c
    Osiris-2 JL: gcc -Wall -c x.c
    x.c:6: warning: missing braces around initializer
    x.c:6: warning: (near initialization for ‘f.d’)
    Osiris-2 JL: gcc -O -Wall -c x.c
    x.c:6: warning: missing braces around initializer
    x.c:6: warning: (near initialization for ‘f.d’)
    Osiris-2 JL: gcc -O -Wextra -Wall -c x.c
    x.c:6: warning: missing braces around initializer
    x.c:6: warning: (near initialization for ‘f.d’)
    x.c:6: warning: missing initializer
    x.c:6: warning: (near initialization for ‘f.e’)
    Osiris-2 JL: