下面的{0}是什么意思?
一个零char的数组?但我不认为你可以使用更小的阵列初始化更大的阵列,或者你可以吗?它会是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 :(得分:3)
{0}
表示“零初始化”此结构或数组。在上面的例子中,rx_buffer.buffer将填充所有零字节,而不是那时发生在堆栈上的任何内容。
以下内容也适用于将整个ring_buffer结构初始化为所有零字节:
ring_buffer rx_buffer = {0};
答案 1 :(得分:1)
您使用以下格式初始化数组:char array = { value1, value2, ...};
在C中,如果数组(或结构)长度大于您用于初始化的值的数量,则编译器会自动将其余值初始化为0
。
同样可以初始化结构。在你的情况下,因为第一个元素是一个数组,它被初始化为一个数组到所有0
。
因此,要解释:ring_buffer rx_buffer = { { 0 }, 0, 0 };
这将声明类型为rx_buffer
的结构变量struct ring_buffer
,并将其所有元素初始化为零。由于第一个元素本身就是一个数组,因此它的初始化方式与初始化常规数组的方式相同。
答案 2 :(得分:1)
这意味着uchar的零init数组(所有元素0) rx_buffer.buffer = {0}
答案 3 :(得分:0)
但我不认为您可以使用较小的阵列初始化较大的阵列,或者可以吗?
如果数组已部分初始化,则未初始化的元素将接收相应类型的值0
这可能会对你有所帮助 How to initialize array to 0 in C?
答案 4 :(得分: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 };
表示buffer
填充零,head
初始化为1,tail
初始化为2。
该代码的作者可能认为有一天代码可能会以这种方式进行更改并明确说明,以避免将来出现可能的错误。