如何在声明时初始化char数组

时间:2010-06-22 15:26:15

标签: 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.c:33:警告:未使用的变量'f'

4 个答案:

答案 0 :(得分:6)

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

对于结构问题,请尝试:

struct c f = { {0}, 0 };

(对于支持C99的新版gcc,您还可以name the elements of the structure being initialised.

答案 1 :(得分:5)

  1. 是的,它们是等价的。

  2. 在默认选项下,结构初始化在没有警告的情况下编译。如果你将编译器设置为繁琐,那么你需要提供一个字符串(第一个问题中的两种形式之一)和一个整数:

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

  3. '挑剔'是什么意思:

    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'设置挑剔'意味着添加诸如'-Wall'和'-Wextra'之类的选项,以获得比GCC正在编译的C标准所要求的更多警告。由于我没有指定哪个标准,所以它适用于GNU-99标准(-std=gnu99)。

    要从问题中获取“未使用的变量”消息,我必须将变量f变为静态变量。

答案 2 :(得分:1)

1)是的,他们是等同的。 2)尝试

struct c f = { "", 0 }

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

struct c f = (struct c){ "", 0 }

如果它不起作用。

另见this page

答案 3 :(得分:1)

是的,前两次初始化是等效的。

第二次初始化在GCC中工作。你的代码是完全正确的。在C语言中,{ 0 } Universal Zero Initializer ,几乎可用于任何类型。这是一个古老而非常成熟的习语。你从GCC获得的只是警告,由那些做出相当无能为力的决定干扰 Universal Zero Initializer 的功能的人放在那里。

[rant] GCC最近在某些方面一直在流失。[/ rant]我理解他们的一般意图,但具体的{ 0 }表格应该作为一个无警告的例外处理。