Why does splint suggest that { 0 } doesn't really initialize all elements to zero in C: Initializer does not define all elements of a declared array 的原因

Why does splint suggest that { 0 } doesn't really initialize all elements to zero in C: Initializer does not define all elements of a declared array

这段代码中(整个文件只有一行):

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 buffer[256] = "";

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

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

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