使用 char 初始化多维数组

initialize multidimensional array with a char?

本文关键字:数组 初始化 char 使用      更新时间:2023-10-16

我想用'/'初始化一个10x10的字符数组。这是我做的:

char array[10][10] = {'/'}

但结果是一个带有 1 '/' 的数组,其他都是空格......

为什么使用 int 数组有效而使用 char 无效?如果我写:

int array[10][10] = {0}

结果是一个充满 0 的数组。

提前感谢您的回答! :)

根据C++标准 *8.5.1 聚合)

7 如果列表中的初始值设定项子句少于 聚合中的成员,则每个成员未显式初始化 应从其大括号或等于初始值设定项初始化,或者,如果有 不是大括号或等号初始值设定项,来自空的初始值设定项列表 (8.5.4).

和(8.5.4 列表初始化)

— 否则,如果初始值设定项列表没有元素,则对象为 值初始化。

和(8.5 初始值设定项)

如果 T 是数组类型,则每个元素都是值初始化的; — 否则,对象初始化为零

因此,在这两个定义中

char array[10][10] = {'/'}
int array[10][10] = {0}

所有没有相应初始值设定项的元素都是值初始化的,对于基本类型意味着零初始化。除数组的第一个元素外的所有元素都将设置为零。这意味着示例中的两个数组以相同的方式"工作":)

当您使用时:

char array[10][10] = {'/'};

只有一个数组元素初始化为 '/'其余元素初始化为零。您可以通过以下方式解决此问题:

  1. 使用 memset 设置所有元素的值。

    memset(&array[0][0], '/', sizeof(array));
    
  2. 使用 for 循环初始化每个成员。

    for (int i = 0; i < 10; ++i )
       for (int j = 0; j < 10; ++j )
          array[i][j] = '/';
    
  3. 使用std::fill填充数据

    std::fill(std::begin(array[0]), std::end(array[9]), '/');
    

    std::fill(std::begin(*std::begin(array)), std::end(*std::end(array)), '/');
    
  4. 使用std::vector而不是数组。

    std::vector<std::vector<char>> array(10, std::vector(10, '/'));
    

你可以使用std::fill

std::fill( &array[0][0], &array[0][0] + sizeof(array), '/' );