为什么夹板建议 { 0 } 并没有真正将所有元素初始化为 C 中的零:初始值设定项没有定义声明数组的所有元素



在这段代码中(整个文件只包含一行(:

char buffer[256] = { 0 };

与Splint核实后,我得到了以下提示:

foo.c(1,20): Initializer block for buffer has 1 element, but declared as char
[256]: 0
Initializer does not define all elements of a declared array. (Use
-initallelements to inhibit warning)

Initializer未定义已声明数组的所有元素这很令人费解:我读到了一些SO的答案,但它们都声称{ 0 }确实将所有元素初始化为零。


拆分版本:

Splint 3.1.1 --- 12 April 2003
Maintainer: splint-bug@splint.org
Compiled using Microsoft Visual C++ 6.0

从Splint.org下载。

是的,它将所有元素归零。一般规则是,如果提供的初始值设定项少于元素,则剩余元素为零。(因此,例如char buffer[256] = {1};将仅将第一个元素设置为1,而将其余元素设置为0。(

警告并没有说剩余的元素未初始化,而是说没有为它们提供初始化程序。在这种特定情况下,此警告没有意义(= {0}是使数组归零的常见模式(,但通常它可能很有用(例如,它会警告int arr[4] = {1,2,3};(。

对于这样的char数组,最常见(也是最安全(的方法似乎是:

char buffer[256] = "";

它可以像其他结构类型一样使用空{}进行初始化:

char buffer[256] = {};  // not working in C, only work for C++

使用{0}似乎更像是初始化结构类型的C++方式。

最新更新