编译错误: “可变大小的对象可能无法初始化”

为什么我收到错误“可变大小的对象可能无法初始化”与以下代码?

int boardAux[length][length] = {{0}};
277728 次浏览

我假设您使用的是 C99编译器(支持动态调整数组大小)。代码中的问题在于,当编译器看到变量声明时,它无法知道数组中有多少元素(我在这里还假设,从编译器错误来看,length不是编译时间常量)。

必须手动初始化该数组:

int boardAux[length][length];
memset( boardAux, 0, length*length*sizeof(int) );

收到这个错误是因为在 C 语言中,不允许对可变长度数组使用初始值设定项。您得到的错误消息基本上说明了一切。

6.7.8初始化

...

3要初始化的实体的类型应为 大小未知的数组或物体 不是可变长度的类型 数组类型。

这就产生了错误:

int len;
scanf("%d",&len);
char str[len]="";

这也会产生错误:

int len=5;
char str[len]="";

但这种方法很有效:

int len=5;
char str[len]; //so the problem lies with assignment not declaration

你需要通过以下方式来衡量价值:

str[0]='a';
str[1]='b'; //like that; and not like str="ab";

简单地声明长度是一个缺点,如果它不是,那么您应该动态分配内存

在声明数组之后

int boardAux[length][length];

将初始值赋值为零的最简单方法是使用 for 循环,即使它可能有点长

int i, j;
for (i = 0; i<length; i++)
{
for (j = 0; j<length; j++)
boardAux[i][j] = 0;
}

这个问题已经得到了回答,但我想指出另一个解决方案,这是快速和工程,如果长度是不打算改变在运行时。在 main ()之前使用宏 # Definition 来定义长度,在 main ()中初始化将起作用:

#define length 10


int main()
{
int boardAux[length][length] = \{\{0}};
}

宏在实际编译之前运行,长度将是编译时常量(正如 David Rodríguez 在答案中提到的)。在编译之前,它实际上将长度替换为10。

int size=5;
int ar[size ]={O};


/* This  operation gives an error -
variable sized array may not be
initialised.  Then just try this.
*/
int size=5,i;
int ar[size];
for(i=0;i<size;i++)
{
ar[i]=0;
}

数组未使用指定的内存初始化,并且抛出错误 variable sized array may not be initialised 我更喜欢通常的初始化方式,

for (i = 0; i < bins; i++)
arr[i] = 0;

可变长度数组是编译器在编译时不知道其长度的数组。在您的例子中,length是一个变量。我得出这样的结论,因为如果 length是一个定义为文字整数的预处理器宏,那么初始化就会正常工作。1989年的第一个 C 语言标准不允许可变长度的数组,它们是在1999年添加的。尽管如此,C 标准还是不允许使用类似于您的表达式来初始化它们(尽管有人可能认为它可以或应该允许这样做)。

初始化变量数组的最佳方法如下:

int boardAux[length][length];
memset( boardAux, 0, sizeof(boardAux) );

memset是一个用于初始化内存的非常快速的标准库函数(在上述情况下为0)。sizeof(boardAux)返回 boardAux占用的字节数。sizeof总是可用的,但 memset需要 #include <string.h>。是的-sizeof允许一个可变大小的对象作为参数。

注意,如果你有一个普通的数组(不是变量长度) ,只是想把内存初始化为零,你从来不需要嵌套的方括号,你可以像这样简单地初始化它:

struct whatEver name[13][25] = {0};