1

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

char buffer[256] = { 0 };

用夹板检查,我得到以下提示:

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下载。

4

2 回答 2

3

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

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

于 2020-08-09T07:25:19.240 回答
0

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

char buffer[256] = "";

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

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

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

于 2020-08-09T07:26:45.463 回答