初始化字符数组 - C 和 C++

initialize char array - C and C++

本文关键字:C++ 字符 数组 初始化      更新时间:2023-10-16

有人问我这个语法是什么意思:

char data[32] = {1};

但是我不记得它做了什么,但我记得它是有效的。
谁能解释它的目的?

这将创建一个包含 32 个字符的数组。第一个元素将为 1,其余元素将设置为零。

如果根本不初始化自动数组(本地和非静态),则数组的元素可能包含垃圾值。

#include <stdio.h>
int main(int argc, char **argv)
{
    int i;
    char data[5];
    for (i = 0; i < 5; i++) {
        printf("data[%d] = %dn", i, data[i]);
    }
    return 0;
}

输出:

data[0] = 72
data[1] = 12
data[2] = -118
data[3] = 51
data[4] = -119

但是,如果您确实对其进行了初始化,它将使用您指定的初始值设定项进行初始化。如果初始值设定项的数量小于数组中元素的总数,则其余元素将初始化为 0。

#include <stdio.h>
int main(int argc, char **argv)
{
    int i;
    char data[5] = {1};
    for (i = 0; i < 5; i++) {
        printf("data[%d] = %dn", i, data[i]);
    }
    return 0;
}

输出:

data[0] = 1
data[1] = 0
data[2] = 0
data[3] = 0
data[4] = 0

它是初始化。它将数组中值为 1 的第一个元素设置为 ( ^A 在我检查的 ASCII 表中),其余元素设置为 0(默认值)。

要在省略的初始值设定项上声明 C99 标准,请执行以下操作:

如果大括号括起来的列表中的初始值设定项少于元素或成员的数量 聚合,或字符串文本中用于初始化已知数组的字符较少 大小比数组中有元素,聚合的其余部分应 隐式初始化与具有静态存储持续时间的对象相同。

和:

如果未显式初始化具有自动存储持续时间的对象, 它的价值是不确定的。如果具有静态存储持续时间的对象是 未显式初始化,则:

  • 如果它具有指针类型,则将其初始化为空指针;
  • 如果它具有算术类型,则将其初始化为(正数或无符号)零;
  • 如果是聚合,则根据这些规则(递归)初始化每个成员;
  • 如果是联合,则根据这些初始化(递归)第一个命名成员 规则。

char是算术类型,因此数组的其余元素将初始化为零。

是的,你没记错。 只需谷歌"C数组初始化":

  • http://www.eskimo.com/~scs/cclass/notes/sx4aa.html

几点注意事项:

  • 在较旧的 ANSI C 编译器下,您不能总是提供 函数内"本地"数组的初始值设定项;你只能 初始化"全局"数组,即任何函数之外的数组。那些 编译器现在很少见,所以你不必担心这一点 区别再也好了。

  • 当数组定义包含初始值设定项时,数组 维度可以省略,编译器会推断维度 从初始值设定项的数量

  • 如果初始值设定项少于数组中的元素,则 其余元素将自动初始化为 0。