为什么我使用以下代码收到错误“可能无法初始化可变大小的对象”?
int boardAux[length][length] = {{0}};
答案 0 :(得分:88)
我假设您使用的是C99编译器(支持动态大小的数组)。您的代码中的问题是,当编译器看到您的变量声明时,它无法知道数组中有多少元素(我也在这里假设,编译器错误length
不是编译时不变)。
您必须手动初始化该阵列:
int boardAux[length][length];
memset( boardAux, 0, length*length*sizeof(int) );
答案 1 :(得分:21)
您收到此错误,因为在C语言中,您不能使用具有可变长度数组的初始值设定项。你得到的错误信息基本上都说明了。
6.7.8初始化
...
3要初始化的实体的类型应为 一个未知大小的数组或一个对象 类型不是可变长度 数组类型。
答案 2 :(得分:11)
这会出错:
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";
答案 3 :(得分:3)
这个问题已经回答了,但是我想指出另一个解决方案,该解决方案是快速的,并且如果不希望在运行时更改长度,则可以使用。在main()之前使用#define宏定义长度,并在main()中进行初始化:
#define length 10
int main()
{
int boardAux[length][length] = ;
}
在实际编译之前运行宏,并且长度将是编译时常数(如DavidRodríguez在其回答中所提及)。实际上,它将在编译之前用10代替长度。
答案 4 :(得分:1)
声明数组后
int boardAux[length][length];
将初始值分配为零的最简单方法是使用for循环,即使它可能有点长
int i, j;
for (i = 0; i<length; i++)
{
for (j = 0; j<length; j++)
boardAux[i][j] = 0;
}
答案 5 :(得分:1)
未使用指定的内存初始化数组,并且引发错误
variable sized array may not be initialised
我更喜欢通常的初始化方式,
for (i = 0; i <= bins; i++)
arr[i] = 0;
答案 6 :(得分:0)
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;
}
答案 7 :(得分:-1)
简单地声明长度是一个缺点,如果不是那么你应该动态分配内存
答案 8 :(得分:-4)
对于C ++单独声明和初始化,就像这样..
int a[n][m] ;
a[n][m]= {0};
答案 9 :(得分:-7)
你不能这样做。 C编译器不能在堆栈上做这么复杂的事情。
您必须使用堆和动态分配。
你真正需要做的事情:
使用* access(boardAux,x,y,size)= 42与矩阵交互。