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++ 初始化结构类型的方式。
这段代码中(整个文件只有一行):
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++ 初始化结构类型的方式。