初始化变长数组

hac*_*cks 19 c array-initialization variable-length-array

在初始化可变长度数组编译器时会给出错误消息:

[Error] variable-sized object may not be initialized  
Run Code Online (Sandbox Code Playgroud)

代码段:

int n; 
printf("Enter size of magic square: ");
scanf("%d",&n);

int board[n][n] = {0};
Run Code Online (Sandbox Code Playgroud)

如何初始化可变长度数组?为什么所有元素都没有0按照以下方式初始化;

   int board[n][n];
   board[n][n] = {0};
Run Code Online (Sandbox Code Playgroud)

Car*_*rum 19

你必须使用memset:

memset(board, 0, sizeof board);
Run Code Online (Sandbox Code Playgroud)

  • 那是什么意思? (8认同)
  • 我不知道`memset()`。 (2认同)
  • 你想把它初始化为'0`,对吧? (2认同)

AnT*_*AnT 18

无法通过任何形式的初始化语法初始化 VLA .您必须在声明后以您喜欢的方式初始值分配给数组元素.

C11:6.7.9初始化(p2和p3):

初始化程序不应尝试为未初始化的实体中包含的对象提供值.

要初始化的实体的类型应为未知大小的数组或不是可变长度数组类型的完整对象类型.

  • @haccks:"Initialized"表示可以在声明中将`= {0}`指定为初始值设定项.您在第一条评论中所拥有的内容完全不正确.甚至在声明中它也只适用于非VLA阵列.例如,你可以做`int array [10] [10] = {0}`.然而,这个问题是关于VLA阵列的.VLA阵列不接受初始化程序.当`m`和`n`不是常量时,你不能做`int array [m] [n] = {0}`. (4认同)
  • @hackks:不。数组是不可分配的。这就是为什么我说“将初始值分配给数组*元素*”。除非像“memset”或“memcpy”这样的原始内存操作,否则必须以逐个元素的方式完成。所以,我的意思是“for (i = 0; i < n; ++i) ...”等等。 (3认同)
  • 你的意思是说'int board [n] [n];``board [n] [n] = {0};`.对? (2认同)