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

时间:2010-06-21 07:52:21

标签: c compiler-errors initializer-list variable-length-array

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

int boardAux[length][length] = {{0}};

10 个答案:

答案 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] = enter image description here;
}

在实际编译之前运行宏,并且长度将是编译时常数(如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编译器不能在堆栈上做这么复杂的事情。

您必须使用堆和动态分配。

你真正需要做的事情:

  • 计算所需内存的大小(n m sizeof(元素))
  • 调用malloc(size)来分配内存
  • 创建一个访问者:int * access(ptr,x,y,rowSize){return ptr + y * rowSize + x; }

使用* access(boardAux,x,y,size)= 42与矩阵交互。