C {0}是什么意思?

C {0}是什么意思?,c,C,下面的{0}是什么意思 一个零字符的数组?但是我不认为可以用较小的数组初始化较大的数组,或者可以吗?它是int,不是char,所以至少会引起一个警告,对吗?还是我完全误解了?这是否会导致缓冲区的第一个字符被清零 struct ring_buffer { unsigned char buffer[SERIAL_BUFFER_SIZE]; volatile unsigned int head; volatile unsigned int tail; }; ring_buff

下面的{0}是什么意思

一个零字符的数组?但是我不认为可以用较小的数组初始化较大的数组,或者可以吗?它是int,不是char,所以至少会引起一个警告,对吗?还是我完全误解了?这是否会导致缓冲区的第一个字符被清零

struct ring_buffer
{
    unsigned char buffer[SERIAL_BUFFER_SIZE];
    volatile unsigned int head;
    volatile unsigned int tail;
};

ring_buffer rx_buffer  =  { { 0 }, 0, 0 };
{0}
表示此结构或数组的“zero init”。在上面的示例中,rx_buffer.buffer将被全部零字节填充,而不是此时堆栈上发生的任何事情

以下内容也可用于将整个环形缓冲区结构初始化为所有零字节:

ring_buffer rx_buffer = {0};
{0}
表示此结构或数组的“zero init”。在上面的示例中,rx_buffer.buffer将被全部零字节填充,而不是此时堆栈上发生的任何事情

以下内容也可用于将整个环形缓冲区结构初始化为所有零字节:

ring_buffer rx_buffer = {0};

以以下格式初始化数组:
char数组={value1,value2,…}

在C语言中,如果数组(或结构)长度大于用于初始化的值的数目,则编译器会自动将其余值初始化为
0

同样,您也可以初始化结构。在您的例子中,由于第一个元素是数组,因此它被初始化为all
0
的数组

因此,要解释:
ring_buffer rx_buffer={{0},0,0}


这将声明类型为
struct ring\u buffer
的结构变量
rx\u buffer
,并将其所有元素初始化为零。由于第一个元素本身就是一个数组,因此它的初始化方式与常规数组的初始化方式相同。

您可以使用以下格式初始化数组:
char array={value1,value2,…}

在C语言中,如果数组(或结构)长度大于用于初始化的值的数目,则编译器会自动将其余值初始化为
0

同样,您也可以初始化结构。在您的例子中,由于第一个元素是数组,因此它被初始化为all
0
的数组

因此,要解释:
ring_buffer rx_buffer={{0},0,0}


这将声明类型为
struct ring\u buffer
的结构变量
rx\u buffer
,并将其所有元素初始化为零。由于第一个元素本身就是一个数组,因此它的初始化方式与常规数组的初始化方式相同。

它的意思是uchar的zero init数组(所有元素0)
rx_buffer.buffer={0}

它是uchar的平均零初始数组(所有元素0)
rx_buffer.buffer={0}

但是我不认为可以用较小的数组初始化较大的数组,或者可以?

如果数组部分初始化,则未初始化的元素将接收相应类型的值0

这可能对你有帮助

但是我不认为可以用较小的数组初始化较大的数组,或者可以吗?

如果数组部分初始化,则未初始化的元素将接收相应类型的值0

这可能对你有帮助
用{0}初始化变量意味着用零填充它。这是一种向代码的审阅者显式显示变量已归零的方法。您的初始化是给其他开发人员的消息,而不是给编译器的消息,因为没有初始化的静态变量默认初始化为0

但是,如果后面跟的是非零值,则它将具有不同的含义。例如:

struct ring_buffer {
   unsigned char buffer[SERIAL_BUFFER_SIZE];
   volatile unsigned int head;
   volatile unsigned int tail;
};

ring_buffer rx_buffer  =  { { 0 }, 1, 2 };
这意味着
缓冲区
用零填充,
初始化为1,
初始化为2


可能代码的作者认为有一天代码可能会以这种方式更改,并将其显式化,以避免将来可能出现的错误。

用{0}初始化变量意味着用零填充它。这是一种向代码的审阅者显式显示变量已归零的方法。您的初始化是给其他开发人员的消息,而不是给编译器的消息,因为没有初始化的静态变量默认初始化为0

但是,如果后面跟的是非零值,则它将具有不同的含义。例如:

struct ring_buffer {
   unsigned char buffer[SERIAL_BUFFER_SIZE];
   volatile unsigned int head;
   volatile unsigned int tail;
};

ring_buffer rx_buffer  =  { { 0 }, 1, 2 };
这意味着
缓冲区
用零填充,
初始化为1,
初始化为2


可能代码的作者认为有一天代码可能会以这种方式进行更改,并将其明确化,以避免将来可能出现的错误。

在这种情况下也会做同样的工作。内部的
{0}
似乎真的是为了读者/维护者的利益而进行了更多的表达,如果表达式的整个RHS只包含
{0}
,而不是
{0},0,0}
“我不认为”——那么隐式的情况已经是这样了——可能想得少一些,多阅读文档?“至少会引起一个警告”--您是否期望
charc='x'生成警告
'x
'在C.@JimBalter中是一个int,有一天过得不好?
在这种情况下也会做同样的工作。内部的
{0}
似乎真的是为了读者/维护者的利益而被表达得更多,如果表达式的整个RHS仅仅由
{0}
组成,那么隐式已经是这样了,与其说
{0},0,0}
“我不认为”——不如少想,多读文档?“至少会引起一个警告”--您是否期望
charc='x'生成警告
'x
'是C.@JimBalter中的一个int,今天过得不好?
{0}
也会将指针初始化为空指针,因此这是初始化任何变量(包括数组和结构)的一个好方法。“{0}表示“zero init”这个结构或数组”-这不是特例<代码>{1}
表示“初始化”