【问题标题】:how to initialize a matrix in C如何在C中初始化矩阵
【发布时间】:2021-03-22 04:50:48
【问题描述】:

我需要在 C 中用空格初始化一个 h x h 矩阵。

如何在没有循环的情况下正确地做到这一点?

int h = 8;
char arr[h][h] = {{' '}}; // does not work.... 

【问题讨论】:

  • 这里不能有部分初始化器。必须提供完整的初始化程序。部分初始值设定项假设缺失部分为零。
  • 这是一个可变长度数组 (VLA),其中维度是可变的。您无法初始化 VLA。如果将h设为常量(例如枚举值),则可以对其进行初始化。
  • @MOehm,如果不变,怎么办?
  • 你试过memset()吗?
  • this?

标签: c multidimensional-array initialization declaration array-initialization


【解决方案1】:

这些声明

int h = 8;
char arr[h][h] = {{' '}};

声明一个可变长度数组。可变长度数组只能在函数中声明(例如在 main 中),因为它们应该具有自动存储持续时间,并且不能在声明中初始化。

所以你可以写例子

#include <string.h>

//...

int main( void )
{
    int h = 8;
    char arr[h][h];

    memset( arr, ' ', h * h );
    //...
}

也就是说,您可以应用标准函数memset,它将数组的所有字符设置为空格字符' '

即使您有一个非可变长度数组,但要使用空格字符初始化其所有元素,最好使用函数memset

#include <string.h>

//...

int main( void )
{
    enum { h = 8 };
    char arr[h][h];

    memset( arr, ' ', h * h );
    //...
}

【讨论】:

  • memset(arr, ' ', sizeof arr) 应该也能正常工作
【解决方案2】:

来自GNU site

要将一系列元素初始化为相同的值,请编写'[first ... 最后] = 价值’。这是一个 GNU 扩展

您可以使用指定的初始化程序。但是这种类型的初始化只对constant number of rows and columns有效。

char arr[8][8] = { { [0 ... 7] = ' '}, { [0 ... 7] = ' '}, { [0 ... 7] = ' '}, { [0 ... 7] = ' '}, { [0 ... 7] = ' '}, { [0 ... 7] = ' '}, { [0 ... 7] = ' '}, { [0 ... 7] = ' '}  };

【讨论】:

  • 这不是标准的 C 功能。此外,它使用幻数 7。
  • 是的,指定的初始值设定项很好……但它们无法解决您正在初始化 VLA 的事实。如果您将尺寸设为常量,它会起作用.. 但原样?
  • 这是一个 VLA,因为尺寸是用变量而不是常数来指定的。
  • 你真正想做的是:{ [0 ... h] = ' '},,但我不确定你能做到,因为hint h = 8;。即使我们这样做:#define h 8,也有问题。如果我们更改该值(例如更改为9),则序列会中断[没有足够的重复]。指定的初始化器很好[我经常使用它们],但是执行memset 或一些for 循环实际上是解决这个给定问题的更好解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-21
  • 2018-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多