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

Nee*_*ran 2 c gcc

这两种方法是否相同?

char a[10] = "";
char a[10] = { 0 };
Run Code Online (Sandbox Code Playgroud)

另外,我想声明初始化一个结构但这在gcc中不起作用:

struct c
{
    char d[10];
    int e; 
};
struct c f = { 0 };
Run Code Online (Sandbox Code Playgroud)

ac:在函数'main'中:
ac:33:警告:初始化器周围缺少括号
ac:33:警告:(初始化'f.d')
ac:33:警告:缺少初始化器
ac:33:警告:(近初始化'f.e')
ac:33:警告:未使用的变量'f'

psm*_*ars 6

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

对于结构问题,请尝试:

struct c f = { {0}, 0 };
Run Code Online (Sandbox Code Playgroud)

(对于支持C99的较新版本的gcc,您还可以命名要初始化的结构元素.)


Jon*_*ler 5

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

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

    struct c
    {
        char d[10];
        int e; 
    };
    struct c f = { "", 0 };
    struct c g = { { 0 }, 0 };
    
    Run Code Online (Sandbox Code Playgroud)

'挑剔'是什么意思:

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: 
Run Code Online (Sandbox Code Playgroud)

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

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