Ç编译错误:“可变大小的对象可以不被初始化”Ç编译错误:“可变大小的对象可以不被初始化”(C com

2019-05-10 13:40发布

为什么我收到错误“可变大小的物体可能无法初始化”下面的代码?

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

Answer 1:

我假设你使用的是C99编译器(带有动态调整阵列的支持)。 在你的代码的问题是,在当编译器看到你的变量声明的时候就不能知道有多少元素在数组中(我也是在此假设,从编译器错误length不是编译时间常数)。

您必须手动初始化数组:

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


Answer 2:

您收到此错误,因为在C语言中你不能使用带有变长数组初始化。 您得到基本的错误消息说,这一切。

6.7.8初始化

...

3被初始化的类型的实体的应是未知大小或不是可变长度数组类型的对象类型的阵列。



Answer 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";


Answer 4:

声明数组后

int boardAux[length][length];

分配的初始值为零的最简单的方法是使用用于环路,即使它可能有点冗长

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


Answer 5:

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



Answer 6:

对于C ++单独的声明和初始化这样的..

int a[n][m] ;
a[n][m]= {0};


Answer 7:

你做不了。 C编译器不能做堆这样的复杂的东西。

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

你真正需要做的:

  • 计算大小(n×m个的sizeof(元素))所需的存储器的
  • 调用malloc(大小)来分配存储器
  • 创建访问:INT *访问(PTR,X,Y,ROWSIZE){返回的ptr + Y * ROWSIZE + X; }

使用*访问(boardAux,X,Y,大小)= 42,以与该基质相互作用。



文章来源: C compile error: “Variable-sized object may not be initialized”