初始化可变长度数组

22

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

[Error] variable-sized object may not be initialized  

代码片段:

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

int board[n][n] = {0};

如何初始化变长数组?为什么下面的方式不会将所有元素初始化为0

   int board[n][n];
   board[n][n] = {0};

?


如果您正在使用cpp,则使用fill(&board [0] [0],&board [n-1] [n-1] + 1,0)来将所有元素初始化为0或您选择的任何值。 - router
3个回答

28

你需要使用memset

memset(board, 0, sizeof board);

2
我对memset()一无所知。 - haccks
10
那是什么意思? - Carl Norum
@haccks,你只需要将它放在int board[n][n];这行下面。并且确保你包含了#include <string.h> - i Code 4 Food
#include <string.h> for C. - Carl Norum
2
你想将它初始化为0,对吗? - Carl Norum
memset是干净的,你也可以将数组的大小左移...在这种情况下*board <<= n * n; - llange

22

可变长度数组(VLA)不能使用任何形式的初始化语法进行初始化。你必须在声明后以你喜欢的方式为数组元素赋初始值。

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

没有初始化器可以为不包含在正在初始化的实体中的对象提供值。

被初始化的实体的类型应为未知大小的数组或完整的对象类型,但不能是可变长度数组类型。


2
你的意思是说 int board[n][n]; board[n][n] = {0};,对吗? - haccks
3
@haccks:不,数组是不可赋值的。这就是我说“将初始值分配给数组元素”的原因。除非进行原始内存操作(如memset或memcpy),否则必须逐个元素地进行操作。所以,我想说的是for(i=0;i<n;++i) ...等等。 - AnT stands with Russia
1
我读到过数组可以被初始化为 array[m][n] = {0},这将把它的第一个元素初始化为 0,其余元素也会被初始化为 0 - haccks
8
在声明中,“Initialized”表示可以将“={0}”指定为初始化项。你在第一个评论中的说法是完全错误的。即使在声明中,它也仅适用于非VLA数组。例如,您可以这样做:“int array [10] [10] = {0}”。然而,这个问题特别涉及到VLA数组。VLA数组不接受初始化项。当“m”和“n”不是常量时,您不能这样做:“int array [m] [n] = {0}”。 - AnT stands with Russia

0
1. 你可以简单地按照以下方式初始化数组-
int n; 
printf("Enter size of magic square: ");
scanf("%d",&n);

int board[n][n];
for(int i=0; i<n; i++)
   for(int j=0; j<n; j++)
   {
      board[i][j] = 0;
   }
}

2. memset() 只应在您想将数组设置为“0”时使用。


"...memset() 应该只在你想将数组设置为“0”时使用。" 呼!为什么这样说? - alk
1
@alk:memset()函数用常量字节c填充指向的内存区域的前n个字节。然而,整数的大小通常为4个字节,因此我们无法将整数设置为所需的数字,但“0”是一种特殊情况,因为使用“0”, memset()会将所有字节都设置为“0”。 - Parag Gangil
2
@ParagGangil; memset()应该只在你想将数组设置为“0”时使用不是真的 - haccks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接